根据属性将多个对象求和到一个数组

时间:2019-07-06 15:38:49

标签: javascript typescript

我想将所有具有相同日期值的对象合并到一个对象数组中。

我已经尝试使用map函数。

我必须遵循对象的类型

[
{a:1, b:2, date:'2019-01-05'}, {a:12, b:22, date:'2019-01-05'}, {a:13, b:23, date:'2019-01-05'},
{a:11, b:2, date:'2019-01-06'}, {a:1, b:22, date:'2019-01-06'}, {a:1, b:23, date:'2019-01-07'}
]

现在我想要一个这样的对象,其中我汇总了所有具有相同日期的对象:

[{date:'2019-01-05', data:[{a:1,b:2},....and so on]}]

所以目前我想出了这个解决方案:

  items = [...]
  moddedItems = [];
   this.items.map((data)=>{
      let tempArray = this.items.filter((obj) => {
        return obj.date === data.date;
      });
      this.moddedItems = [...this.moddedItems, {date:data.date, data:[...tempArray]}];
      console.log(this.moddedItems)
    });

2 个答案:

答案 0 :(得分:2)

Array.map(...)不适合在此处使用,因为您希望得到的数组中的元素数少于原始数组,因此可以使用Array.reduce(...)生成所需的结果,下面是一个示例:

const arr = [
{a:1, b:2, date:'2019-01-05'}, {a:12, b:22, date:'2019-01-05'}, {a:13, b:23, date:'2019-01-05'},
{a:11, b:2, date:'2019-01-06'}, {a:1, b:22, date:'2019-01-06'}, {a:1, b:23, date:'2019-01-07'}
];

const result = arr.reduce((a, c) => {
  const o = {
    a: c.a,
    b: c.b
  }
  const found = a.find(({ date }) => date === c.date);
  if (found) {
    found.data.push(o)
  } else {
    a.push({
      date: c.date,
      data: [o]
    })
  }
  return a;
}, []);

console.log(result)

答案 1 :(得分:1)

您可以使用以日期为键的Map,对于每个对象,您最初都将存储一个具有空data属性的对象,然后只需填充data属性即可迭代原始数据:

const data = [
    {a:1, b:2, date:'2019-01-05'}, {a:12, b:22, date:'2019-01-05'}, {a:13, b:23, date:'2019-01-05'},
    {a:11, b:2, date:'2019-01-06'}, {a:1, b:22, date:'2019-01-06'}, {a:1, b:23, date:'2019-01-07'}
];

const map = new Map(data.map(({date}) => [date, { date, data: [] }]));
data.forEach(({date, ...o}) => map.get(date).data.push(o));
const result = [...map.values()];

console.log(result);