以下のようなリストから、その下に掲載している配列を抽出する為には、
どのようにするのが良いのでしょうか?
やりたいこととしては、orderList配列の中の各オブジェクトの中にある、
products配列の中にあるプロダクトIDとitemList配列の中の各オブジェクトの中のidの値が同一な場合に、
そのitemList配列内の同一プロダクトidを持つオブジェクト内のitems配列の中にある各オブジェクトを取り出し、
それらを1つの配列の中に1次元配列としてまとめたいです。
文章にすると、ややこしいですが、やりたいことはシンプルなのです。
一応、自分で得たい結果は取得するコードは既に書いたのですが、
- mapファンクションでまずorderListの中から各products配列を抽出
- mapファンクションで抽出した配列は2次元になってしまってるので、それをreduceファンクションを使って、array.concat()で1次元配列化したものを抽出
3. 2で取得したプロダクトIDリストから重複するプロダクトIDを削除(フィルターファンクションを使いました)
4. 3で取得したプロダクトIDリストとマッチするitemList内のitem配列をmapファンクションで抽出
5. ....
6. ....
と6ステップかけてようやく得たい結果を超手続き型な感じで取り出すことができました。。。
なんか違う感があるのですが、皆様ならどのように書くのでしょうか?
※補足: なんか違う感というのは、mapなどのメソッド使うと直ぐに多次元配列になってしまって、それをまた、他の処理の為に1次元配列に戻さないといけなかったり、更にそういうのが二回必要だったりと、もっと短く出来る方法ってないのかなと思いまして。冗長に感じるということです。
入力
const itemList = [ { id: 'p1', items: [ { id: 1 }, { id: 2 }, { id: 3 } ] }, { id: 'p2', items: [ { id: 1 }, { id: 10 }, { id: 33 } ] }, { id: 'p3', items: [ { id: 11 }, { id: 22 }, { id: 33 } ] } ]; const orderList = [ { id: '1', products: [ 'p1' ] }, { id: '2', products: [ 'p3' ] } ];
得たい結果
const items = [ { id: 1 }, { id: 2 }, { id: 3 }, { id: 11 }, { id: 22 }, { id: 33 } ]
補足
lodash使えば一発だよ!みたいな回答でもありがたいです。
回答3件
あなたの回答
tips
プレビュー