当 id 匹配时汇总属性值并使用 javascript 返回结果

问题描述 投票:0回答:1

我正在尝试实现一个相当复杂的迭代,但到目前为止使用reduce 还没有成功。这是一个小例子

输入如下

let input = {
    "data": [
        {
            "state": "CA",
            "tests": 12,
            "city": [ "Mountain View"],
            "metadata": { "id": 15 },
        },
        {
            "state": "TX",
            "tests": 10,
            "city": [ "Austin" ],
            "metadata": { "id": 15 },
        },
        {
            "state": "AZ",
            "tests": 5,
            "city": [ "Flagstaff" ],
            "metadata": { "id": 10 },
        },
    ],
}

正如您可以清楚地看到的,id 在 2 个对象中重复了两次。我想当 id 相同时将这两个对象连接成一个。因此,如果有 3 个具有相同 id 的对象,我想将 3 个对象连接为一个。除此之外,我还想在 id 匹配时将州和城市属性连接起来。当 id 匹配时,

tests
也应该相加。

所以我的最终输出应该是这样的

let result = {
    "data": [
        {
            "state": ["CA", "TX"],
            "tests": 22,
            "city": ["Mountain View", "Austin"],
            "metadata": { "id": 15 },
        },
        {
            "state": "AZ",
            "tests": 5,
            "city": [ "Flagstaff" ],
            "metadata": { "id": 10 },
        },
    ],
}

有人可以让我知道如何精确实现这一目标吗?这是我尝试使用reduce的方法,我已经完成了一半。我唯一无法得到的是当 id 匹配时我如何总结

tests
属性并在这种情况下使
tests
总数为 22。

let total_tests = 0;
let res = [{
  data: Object.values(input[0].data.reduce((acc, {state, city, metadata, tests, category
  }) => {
    const id = metadata ? .id;

    if (!acc[id]) {
      acc[id] = {
        id,
        state: [],
        city: [],
        metadata,
        tests,
        category
      }
    }
    acc[id].state.push(state)
    acc[id].city.push(...city)
    debugger
    acc[id].tests = total_tests + acc[id].tests;
    return acc
  }, {}))
}]
javascript arrays loops object iteration
1个回答
0
投票

您可以使用

tests: 0
初始化对象并添加实际值。

let input = {
  "data": [{
      "state": "CA",
      "tests": 12,
      "city": ["Mountain View"],
      "metadata": {
        "id": 15
      },
    },
    {
      "state": "TX",
      "tests": 10,
      "city": ["Austin"],
      "metadata": {
        "id": 15
      },
    },
    {
      "state": "AZ",
      "tests": 5,
      "city": ["Flagstaff"],
      "metadata": {
        "id": 10
      },
    },
  ],
}

let res = [{
  data: Object.values(input.data.reduce((acc, { state, city, metadata, tests }) => {
    const id = metadata?.id;

    acc[id] ??= { id, state: [], city: [], metadata, tests: 0 };
    acc[id].state.push(state)
    acc[id].city.push(...city)
    acc[id].tests += tests;
    return acc
  }, {}))
}];

console.log(res);

© www.soinside.com 2019 - 2024. All rights reserved.