循环遍历对象数组,对数组元素求和并将结果放入最后一个元素

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

我有一个对象数组,如下所示。每个对象内部都有一个数组

P2

let input = [ 
     { "P2": [ 6, 6, 0 ] },
     { "P2": [ 3, 2, 0 ] },
     { "P2": [ 5, 1, 0 ] },
]

我想要想要的结果。如您所见,我正在添加元素并将结果放入最后一个元素中。例如添加 6+6+0 并将结果放入最后一个元素作为 12。对于数组内的其他对象也是如此。所以最终的输出将如下所示。

   [ 
     { "P2": [ 6, 6, 0, 12 ] },
     { "P2": [ 3, 2, 0, 5 ] },
     { "P2": [ 5, 1, 0, 6 ] },
   ]

我可以通过简单的循环和归约函数来实现这一点,如下所示。

input.forEach(arrayItem => {
  let sum = arrayItem.P2.reduce((partialSum, a) => partialSum + a, 0);
  arrayItem.P2.push(sum)
});

console.log(input)

到这里为止还好。但当我有动态输入时,它变得非常有趣。例如对于静态

P2
值,我可以有其他任何东西。例如下面显示的是动态输入的 2 个示例。

let input = [ 
     { "P1": [ 6, 6, 0 ] },
     { "P2": [ 3, 2, 0 ] },
     { "P3": [ 5, 1, 0 ] },
]

let input = [ 
     { "P2": [ 3, 3, 3, 2 ] },
     { "P2": [ 7, 7, 7, 4 ] },
     { "Total": [ 5, 1, 4, 6 ] },
]

如果有这样的动态属性名称,有人可以让我知道如何修改我的代码吗?

javascript arrays json loops object
1个回答
2
投票

您可以迭代数组中的每个对象,并使用 Object.keys()Object.entries() 动态访问属性名称。

let input = [ 
    { "P1": [ 6, 6, 0 ] },
    { "P2": [ 3, 2, 0 ] },
    { "P3": [ 5, 1, 0 ] },
];

input.forEach(arrayItem => {
    let propertyName = Object.keys(arrayItem)[0];
    let values = arrayItem[propertyName];
    
    let sum = values.reduce((partialSum, value) => partialSum + value, 0);
    values.push(sum);
});

console.log(input);

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