我正在try 实现一个相当复杂的迭代,但到目前为止还没有成功地使用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在两个对象中重复两次.当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 },
        },
    ],
}

有没有人能告诉我如何准确地实现这一点.下面是我如何try 使用reduce,我已经达到了一半.唯一的事情我无法得到的是我如何总结tests属性时,id是匹配的,并获得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
  }, {}))
}]

推荐答案

您可以使用以下命令初始化该对象

tests: 0

并将实际值添加到具有相同id的对象/属性:

acc[id].tests += tests;

const
    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 } }] },
    result = [{
        data: Object.values(input.data.reduce((acc, { state, city, metadata, tests }) => {
            const id = metadata?.id;
            acc[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(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Javascript相关问答推荐

通过在页面上滚动来移动滚动条

单击子元素时关闭父元素(JS)

防止用户在selectizeInput中取消 Select 选项

React 17与React 18中的不同setState行为

使用Java脚本根据按下的按钮更改S文本

变量的值在Reaction组件中的Try-Catch语句之外丢失

使用原型判断对象是否为类的实例

我怎么在JS里连续加2个骰子的和呢?

try 使用javascript隐藏下拉 Select

使用js构造一个html<;ath&>元素并不能使其正确呈现

图表4-堆叠线和条形图之间的填充区域

当我点击一个按钮后按回车键时,如何阻止它再次被点击

判断函数参数的类型

在SuperBase JS客户端中寻址JSON数据

自动滚动功能在当前图像左侧显示上一张图像的一部分

是否设置以JavaScript为背景的画布元素?

当达到高度限制时,如何裁剪图像?使用html和css

将以前缓存的 Select 器与querySelector()一起使用

如何用react组件替换dom元素?

JavaScript structuredClone在Chrome/Edge中获得了非法调用,但在NodeJS中没有