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

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

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

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

Q&A

解決済

3回答

3047閲覧

JS: オブジェクト配列同士の値の比較

goro

総合スコア9

JavaScript

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

0グッド

1クリップ

投稿2022/04/02 15:19

編集2022/04/02 15:21

困っているわけではありませんが、他の方法もあるのであればご教授いただきたくての質問です。

二つのオブジェクト配列を比較して「同じ値」をもっているデータだけ抜き出し新たなオブジェクト配列を作成する方法をご存知の方いますでしょうか?

下記のやり方で、出来ているのですが、もっとスマートなやり方はないものかと考え中です。

他の方のやり方は考えなどを参考にしたいので「自分ならこうする!」ぐらいの軽い気持ちでお答えいただけますと幸いです。

JS

1const objA = [ 2 { name: "Taro", age: 18 }, 3 { name: "Hanko", age: 20 }, 4 { name: "Jiro", age: 30 } 5]; 6 7const objB = [ 8 { name: "Suzuki", age: 20 }, 9 { name: "Yamada", age: 20 }, 10 { name: "Tanaka", age: 30 }, 11 { name: "Oguri", age: 31 } 12]; 13 14// objAからageだけの配列を作成 15const agesByObjA = objA.map((obj) => obj.age); 16 17// objB.ageの値が、agesByObjAに含まれるものだけを抽出、含まれていない場合[]が返る 18const notSameAges = objB.filter((obj) => agesByObjA.includes(obj.age) && obj); 19console.log(notSameAges); 20

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

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

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

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

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

miyabi_takatsuk

2022/04/04 00:38

ほしい結果の配列は記載したままの方がよいかと。 ほしい形がわかった方が、回答得られやすいと思いますので。
goro

2022/04/04 05:16

なるほど。その方がイメージしやすいですね。 下記の配列が欲しい結果です。 [ { name: "Suzuki", age: 20 }, { name: "Yamada", age: 20 }, { name: "Tanaka", age: 30 }, ];
guest

回答3

0

個人的には今のコードで十分な気もします。
見通しがよくなるように

javascript

1const notSameAges = objB.filter(new Function('obj', 'return [' + objA.map((obj) => obj.age).toString() + '].includes(obj.age);'));

と思ったんですけど、関数を文字列でつくるのが面倒ですね。(汗

投稿2022/04/03 12:15

takasima20

総合スコア7468

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

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

0

そのコードでも良いと思います。殆ど変わりませんが、私なら Set を使います。

js

1const objA = [ 2 { name: "Taro", age: 18 }, 3 { name: "Hanko", age: 20 }, 4 { name: "Jiro", age: 30 } 5]; 6 7const objB = [ 8 { name: "Suzuki", age: 20 }, 9 { name: "Yamada", age: 20 }, 10 { name: "Tanaka", age: 30 }, 11 { name: "Oguri", age: 31 } 12]; 13 14const st = new Set(); 15objA.forEach(obj => st.add(obj.age)); 16const ret = objB.filter(obj => st.has(obj.age)); 17console.log(ret);

投稿2022/04/02 15:32

編集2022/04/02 15:34
arcxor

総合スコア2857

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

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

0

ベストアンサー

javascript

1const notSameAges = objB.filter(obj => objA.some(objAinner => objAinner.age == obj.age) && obj); 2console.log(notSameAges);

someメソッド使えばよいかと。
someメソッドは、配列を走査し、どれか一つでも真になれば、走査を終了、論理値を返します。
事前に値だけの配列を用意する必要はありません。

投稿2022/04/02 15:32

miyabi_takatsuk

総合スコア9555

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

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

goro

2022/04/10 20:15

一番スマートなやり方だと感じたのでベストアンサーに選ばさせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問