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

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

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

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

配列

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

Q&A

解決済

3回答

1301閲覧

JSで配列の再生成を行いたい

van-0215

総合スコア89

JavaScript

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

配列

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

0グッド

0クリップ

投稿2020/06/04 14:29

オブジェクトの配列とオブジェクトの配列のアイテムを比較して、配列を再生成したいです。単純にforやforEachを使うことでこれはできるのですが、これらを使わない方法(map や filterの組み合わせ)でこれができるかどうかを知りたいと思っています。

const a = [{id: '2'},{id: '4'}]; const b = [{id: '1', name: 'a'},{id: '2', name: 'b'},{id: '3', name: 'c'},{id: '4', name: 'd'}]; // b.map(item => a[0...4].id === item.id); このようにしたいです。

// 参考: forEachを使った場合

const result = []; b.forEach(item1 => { a.forEach(item2 => { if (item2.id === item1.id) { result.push(item1); } }); });

どなたか JSが得意な人教えて欲しいです。

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

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

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

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

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

guest

回答3

0

filtersomeの組み合わせでいけるかと思います。

javascript

1const result = b.filter( 2 itemB => a.some(itemA => itemA.id == itemB.id) 3);

なお、aの要素が多い場合、事前に有効なidaから抽出してSetなどに格納しておくことで、毎回aを全探索しないようにするほうがいいかと思います。

投稿2020/06/04 14:49

maisumakun

総合スコア146018

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

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

0

ベストアンサー

こういうことでよいでしょうか?

javascript

1const result = b.filter(e1 => a.find(e2 => e1.id === e2.id)); 2 3console.log(result); // => [{id: '2', name: 'b'},{id: '4', name: 'd'}]

または、 result に含める id のSet を作っておいて、これをfilter に与える関数で使う手もあります。

javascript

1const ids = new Set(a.map(e => e.id)); 2const result = b.filter(e => ids.has(e.id)); 3 4console.log(result); // => [{id: '2', name: 'b'},{id: '4', name: 'd'}]

あるいは、ご質問にある例のように、b のいずれかの要素の中に、a の要素の id** はすべて出現するという前提があれば**、a を map して作るということも考えられます。ただしこの前提は、(ご質問には明示的に書かれてはいませんが、)もしかするとちょっと要件から外れるかもしれませんので、参考までに。

javascript

1const result = a.map(e1 => b.find(e2 => e2.id === e1.id)); 2 3console.log(result); // => [{id: '2', name: 'b'},{id: '4', name: 'd'}]

投稿2020/06/04 14:49

編集2020/06/04 15:24
jun68ykt

総合スコア9058

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

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

0

javascript

1const result = b.filter(x =>a.map(x=>x.id).includes(x.id));

投稿2020/06/04 14:58

yambejp

総合スコア116724

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問