首页 > 解决方案 > 合并对象数组中的两个对象

问题描述

我有以下数组:

[
    {
        "idItem": "5d656f10394d6524c821f1b1",
        "mark": 5,
        "date": "2018-11-27T00:00:00.000Z"
    },
    {
        "idItem": "5d656f10394d6524c821f1b1",
        "mark": 2,
        "date": "2018-11-27T00:00:00.000Z"
    },
    {
        "idItem": "5d656f10394d6524c821f1b1",
        "mark": 1,
        "date": "2018-12-27T00:00:00.000Z"
    },
    {
        "idItem": "5d656f10394d6524c821f1b1",
        "mark": 2,
        "date": "2018-12-27T00:00:00.000Z",
    }
]

我想根据idItem日期合并对象并计算平均标记,这样我就可以拥有以下内容:

[
    {
        "idItem": "5d656f10394d6524c821f1b1",
        "mark": 3.5,
        "date": "2018-11-27T00:00:00.000Z"
    },
    {
        "idItem": "5d656f10394d6524c821f1b1",
        "mark": 1.5,
        "date": "2018-12-27T00:00:00.000Z"
    }
]

标签: javascriptarraysobject

解决方案


尝试这个:

const input = [
  { idItem: "5d656f10394d6524c821f1b1", mark: 5, date: "2018-11-27T00:00:00.000Z" },
  { idItem: "5d656f10394d6524c821f1b1", mark: 2, date: "2018-11-27T00:00:00.000Z" },
  { idItem: "5d656f10394d6524c821f1b1", mark: 1, date: "2018-12-27T00:00:00.000Z" },
  { idItem: "5d656f10394d6524c821f1b1", mark: 2, date: "2018-12-27T00:00:00.000Z" }
];

const ids = new Set(input.map(e => `${e.idItem} ${e.date}`));
const grouped = [...ids].map(id => input.filter(
  e => `${e.idItem} ${e.date}` === id
)).map(
  group => ({
    ...group[0],
    mark: group.reduce((acc, cur) => cur.mark + acc, 0) / group.length,
  })
);

您可以在此处查看已注销的结果

可能不是性能最高的,但它确实有效。首先我们得到一组 id 和 date 的所有组合,然后过滤每个组合的输入。然后,对于每个组,我们将日期和 ID 复制到结果中,并减少条目以获得平均值。


推荐阅读