我有以下格式的数据,
const data = [{
key:'key1',
rows:[
["A","2018","B","1"],
["A","2018","C","5"],
["A","2018","B","4"],
["A","2018","C","2"],
]
},
{
key:'key1',
rows:[
["A","2018","B","10"],
["A","2018","C","50"],
["A","2018","B","40"],
["A","2018","C","20"],
]
}]
我想首先减少行
并根据第三个值对每个数组中的最后一个值求和。输出应该是这样的,
const data = [{
key:'key1',
rows:[
["A","2018","B","5"],
["A","2018","C","7"]
]
},
{
key:'key1',
rows:[
["A","2018","B","50"],
["A","2018","C","70"]
]
}]
此后,我想合并这两个对象并对行
中的值求和。 最终输出应该是这样的,
const data = [{
key:'key1',
rows:[
["A","2018","B","55"],
["A","2018","C","77"]
]
}]
我已经尝试过这个,但没有得到所需的输出,
data.map(data => ({
...data,
rows: data.rows.reduce((array, value) => {
if(array.length > 0){
let found = false;
array.map(m => {
if(m[2] === value[2]){
found = true;
return [...m, m[3] = parseInt(m[3]) + parseInt(value[3])]
}
})
if(!found){
array.push(value)
}
return array
}else{
array.push(value)
return array
}
}, [])
}))
最佳答案
实现此目的的一种方法是迭代对象以获取行并将其展平,然后reduce
数组以聚合它们,最后使用Object.values
最后得到正确的数据集。
const data = [{ key: 'key1', rows: [ ["A", "2018", "B", "1"], ["A", "2018", "C", "5"], ["A", "2018", "B", "4"], ["A", "2018", "C", "2"] ] }, { key: 'key1', rows: [ ["A", "2018", "B", "10"], ["A", "2018", "C", "50"], ["A", "2018", "B", "40"], ["A", "2018", "C", "20"]]}];
const key = data[0].key;
// Use `flatMap` to iterate over the object and merge the rows
const merged = data.flatMap(el => el.rows);
const rows = Object.values(merged.reduce((acc, c) => {
const [ k1, k2, k3, k4 ] = c;
acc[k3] = acc[k3] || [ k1, k2, k3, 0 ];
acc[k3][3] += +k4;
return acc;
}, {}));
console.log([{ key, rows }]);
注意:如果您需要返回字符串的聚合数字,只需映射结果即可:
.map(([ a, b, c, d ]) => {
return [ a, b, c, d.toString() ];
});
进一步阅读
关于javascript - 合并嵌套数组并对值求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58170521/