質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1168閲覧

配列(内はJSON)同士を条件によって結合したい

kito-chall

総合スコア16

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2020/10/02 01:41

前提・実現したいこと

for文の中にfor文をいれる方法しか思いつかず、
データ量が増えた際に処理が重くなってしまうのではないかと思い
スマートな記述方法をご教示願います。

データ

下記2つの配列を条件によって結合させたいです。

■条件

  • idが同じ
  • 必要なkey, valueだけ取り出す(id, name, age)

javascript

1const arrayA = [ 2 {"id": "1", "name": "a", "hoge": "hoge"}, 3 {"id": "2", "name": "b", "hoge": "hoge"}, 4 {"id": "3", "name": "c", "hoge": "hoge"}, 5 {"id": "4", "name": "d", "hoge": "hoge"}, 6 {"id": "5", "name": "e", "hoge": "hoge"}, 7 {"id": "6", "name": "f", "hoge": "hoge"} 8 ] 9const arrayB = [ 10 {"id": "3", "age": "10"}, 11 {"id": "6", "age": "20"} 12] 13 14 15// expected output: 16// [ 17// {"id": "1", "name": "a", "age": null}, 18// {"id": "2", "name": "b", "age": null}, 19// {"id": "3", "name": "c", "age": "10"}, 20// {"id": "4", "name": "d", "age": null}, 21// {"id": "5", "name": "e", "age": null}, 22// {"id": "6", "name": "f", "age": "20"} 23// ]

ご回答いただけると幸いです。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/10/02 01:42

>スマートな記述方法をご教示願います。 まず自身が思うようにやってみた結果をご提示ください。 なにも提示しないまま作業依頼に近しい内容になってます。
yambejp

2020/10/02 02:19

・arrayAのhogeは不要 ・ageはarrayBにあればその値、なければnull という条件ですね?
kuma_kuma_

2020/10/02 02:22

この質問は arrayA に arrayB の内容を追加する arrayB に arrayA の内容を追加する arrayA と arrayB の内容で arrayC を作成する どれに該当しますか? 今回結果としては2重ループにはならないと思いますが 相当量が無いと処理が遅くなることはないかと思います for(var i = 0; i < 10000; i++){ for(var j = 0; j < 10000; j++){ } } 試してみて下さい。
kito-chall

2020/10/05 06:15

ご意見・ご協力ありがとうございます。 次回からは具体的に何を試したのか記載していきたいと思います。
m.ts10806

2020/10/05 06:17

質問は編集できるので、いつ来るかわからない次回に回すより、今対応されたほうが良いと思います。 結局のところ他者には質問に書いてあることが全てです。
guest

回答2

0

ベストアンサー

データ量が増えた際に処理が重くなってしまうのではないかと思い

arrayA の代わりに 10万件のデータを機械的に作成してみました。

javascript

1var makeList = ( max ) => Array.from({ length:max }, 2 (_,i) => ({id:i, name:"name"+i, note:"note"+i}) 3); 4var list = makeList( 100000 ); // 10万件のダミーデータ生成 5console.log( list );

console.time()/ console.timeEnd() で for - for の処理速度を確かめてみてください。

近年の端末は高性能ですし、モダンブラウザのJavaScript実行速度も無駄がない限り
相当な件数を扱う事にでもならない限りストレスを感じることはないと思いますが、ユーザの環境に依存します。

※10万件は、100件ずつ表示して1000ページであり、「人の手作業による確認作業」を考えると苦痛にも感じる件数です。
この件数だと、サーバー側でDBを使うのが現実的でしょうし、DBから読み込んだ情報に付与して上書きするなどの方法で、一気に処理するのではなく、更新の遅延を許容する仕組みにしても良いと思います。

スマートな記述方法をご教示願います。

for文の中にfor文をいれる方法 は反復処理の基礎になります。
これが出来ているなら、Array の各種メソッドを使って反復処理を置き換える事を考えてください。

javascript

1var arrayB = [ 2 {"id": "3", "age": "10"}, 3 {"id": "6", "age": "20"} 4]; 5 6// 1. id をプロパティ名に持った key-value を作る 7// Map オブジェクトを使うとよりモダンになると思いますが、古典的にObjectを作る。 8var keyval = arrayB.reduce( (rslt, entry) => 9 (rslt[entry.id] = entry, rslt), {}); 10console.log( keyval ); 11/* 12 => { 13 3: {"id": "3", "age": "10"}, 14 6: {"id": "6", "age": "20"} 15 } 16 */ 17 18// 2. 上記ダミーデータを総当りしつつ、全配列要素に age プロパティを付与する 19var merged = list.map( entry => 20 Object.assign(entry, {age:null}, kv[entry.id]) ); 21console.log( merged );

※すでに回答が出ていますが、各配列要素をどのように処理するかが重要と思います。(追記

投稿2020/10/02 03:05

編集2020/10/02 03:12
AkitoshiManabe

総合スコア5434

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kito-chall

2020/10/05 06:18

詳細かつ、丁寧にご回答いただきありがとうございます。 大変勉強となりましたのでこちらをベストアンサーとさせていただければと思います。
guest

0

javascript

1const result=arrayA.map(x=>({id:x.id,name:x.name,age:arrayB.filter(y=>y.id==x.id)[0]?.age||null})); 2console.log(result);

投稿2020/10/02 02:25

yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kito-chall

2020/10/05 06:20

スマートなご回答をいただきありがとうございます。 私基準で大変、申し訳ございませんが、データ件数についても回答してくださった方をベストアンサーとさせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問