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

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

新規登録して質問してみよう
ただいま回答率
85.35%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

JavaScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1709閲覧

node.js 2つの配列のなかのオブジェクトをIDプロパティが一致していればマージしたい

KT333

総合スコア3

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

JavaScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2021/10/26 09:38

編集2021/10/26 09:48

下記のようなオブジェクトがあります。

JavaScript

1const objArr1 = [ 2 { 3 id: '1', 4 name: 'nyaa', 5 }, 6 { 7 id: '2', 8 name: 'myoon', 9 }, 10]; 11 12const objArr2 = [ 13 { 14 id: '1', 15 kg: '20', 16 }, 17 { 18 id: '2', 19 kg: '30', 20 }, 21 { 22 id: '3', 23 kg: '100', 24 }, 25]; 26

オブジェクト内のIDが一致していれば、オブジェクトを合体させたいです。
下記のような結果を期待します。

JavaScript

1const result = [ 2 { id: '1', name: 'nyaa', kg: '20' }, 3 { id: '2', name: 'myoon', kg: '30' } 4]

考えた解決策は下記のコードですが、無駄が多いと思います……。
オブジェクトを2回mapで回してidが一致していたものを返し、それ以外はnullが返り、flat()してfilterでnullを消してます。
一応想定通りに動いています(nestしたときどうかは不明だが、nestしない予定なのでいまのところは良し)

JavaScript

1const result = objArr1 2 .map((obj) => { 3 const obj3 = objArr2.map((obj2) => { 4 if (obj.id === obj2.id) return { ...obj, ...obj2 }; 5 return; 6 }); 7 return obj3; 8 }) 9 .flat() 10 .filter(Boolean); 11

もっときれいな解決法はないでしょうか。
なんらかのライブラリを使用しても大丈夫です(ramda.jsなど)。

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

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

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

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

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

yambejp

2021/10/26 09:43

objArr1 とobjArr2 のおなじidがあるものだけ抜き出すのでしょうか? それともobjArr1に対してobjArr2をidをつかって流し込むのでしょうか?
KT333

2021/10/26 09:46

objArr1のIDとobjArr2のIDが一致しているとき objArr1のプロパティとobjArr2のプロパティを持ったresultオブジェクトの配列を生成したいです。(id,name,kgを持った新オブジェクト)
guest

回答2

0

ベストアンサー

与件をこのように解釈しました。

  • objArr1 の各要素e1について、id が等しいものがobjArr2の中に(一つ以上)あれば、そのe1 を元にして作られたオブジェクトが、result の要素として追加される。
  • あるe1を元にした要素がresult に追加される際には、そのe1.id と、objArr2の中でidが一致する、最も先頭に近い要素 e2 の内容とマージされたオブジェクトが追加される。
  • あるe1について、id が等しいものがobjArr2の中に無い場合は、resultに追加されない。
  • したがって、resultに追加されるオブジェクトのidと同じidのオブジェクトが objArr1objArr2 との両方に少なくとも一個以上ずつ存在する。

上記であるとして、以下でどうでしょう?

javascript

1const result = objArr1.reduce((arr, e1) => { 2 const e2 = objArr2.find(({ id }) => id === e1.id); 3 return e2 ? [...arr, { ...e1, ...e2 }] : arr; 4}, []);

???? codepen/tera: 366324

与件が微妙に違うとかあれば、コメントか質問への追記でお知らせください。

投稿2021/10/26 11:35

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

KT333

2021/10/26 14:18

自分がどういう動作を求めているのかがよくわかりました。仕様の定義の大事さがよくわかりました。ありがとうございます。
guest

0

objArr1とobjArr2両方に存在するidを抜き出し、filterしてはどうでしょうか?

javascript

1const objArr1 = [ 2 { id: '1',name: 'nyaa'}, 3 { id: '2',name: 'myoon'}, 4 { id: '4',name: 'hogehoge'}, //objArr2に存在しないので無効 5]; 6 7const objArr2 = [ 8 { id: '1', kg: '20' }, 9 { id: '2', kg: '30' }, 10 { id: '3', kg: '100'}, //objArr1に存在しないので無効 11]; 12const ids=[...objArr1.map(x=>x.id)].filter(x=>[...objArr2.map(x=>x.id)].includes(x)); 13const result=ids.map(x=>({...objArr1.filter(y=>y.id==x)[0],...objArr2.filter(y=>y.id==x)[0]})); 14console.log(result);

※各objArrの中に同じidが複数オブジェクトに出現しない前提

投稿2021/10/26 10:09

編集2021/10/26 10:10
yambejp

総合スコア116724

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

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

KT333

2021/10/26 14:18

idを抜き出してのfilterは良さそうです! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問