RitaChan
@RitaChan

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

reduce()を使ったリファクタリング

Q&A

Closed

解決したいこと

reduce() を使って以下のコードをリファクタリングしたいです。
現状複数回mapを回しているので、計算量が多くなってしまっています。。。
(これでもいいのですが、どうしても気になります...)

出力される結果は以下の形に持って行きたいです。
・同じ日付のものはitemsとして配列に渡す

[
  {
    "date": "2020-1-1",
    "items": [
      "1",
      "2"
    ]
  }, {
    "date": "2020-2-1",
    "items": [
      "3"
    ]
  }
] 

今の自分のソースコード

const data = [
   {
     date: '2020-1-1',
     item: '1'
   },
   {
     date: '2020-1-1',
     item: '2',
   },
   {
     date: '2020-2-1',
     item: '3',
   }
 ];
 
 const newDate = Array.from(new Set(data.map((i) => i.date)));
 
 const result = newDate.map((i) => {
   const items =  data.filter((x) => x.date === i).map((x) => x.item)
   return {
     date: i,
     items: items
   }
 })
0

2Answer

例えば、次のようなサンプルスクリプトはいかがでしょうか。

const data = [
  {
    date: '2020-1-1',
    item: '1'
  },
  {
    date: '2020-1-1',
    item: '2',
  },
  {
    date: '2020-2-1',
    item: '3',
  }
];
const result = [...data.reduce((m, { date, item }) => m.set(date, { date, items: m.has(date) ? [...m.get(date).items, item] : [item] }), new Map()).values()];
console.log(result)

1Like

Your answer might help someone💌