function merge(arr) {
var ret = [];
var sourceKeys = ["名称", "排序", "单位", "单价"];
var targetKeys = ["数量", "金额"];
loop: for (var i = 0, key, obj; i < arr.length; ++i) {
find: for (var j = 0, value; j < ret.length; ++j) {
for (var k = 0; k < sourceKeys.length; ++k) {
key = sourceKeys[k], value = arr[i][key];
if (ret[j][key] !== value) continue find;
}
for (var k = 0; k < targetKeys.length; ++k) {
key = targetKeys[k], value = arr[i][key];
if (typeof value === "string") {
ret[j][key] = (+ret[j][key] + +value).toFixed(2);
} else {
ret[j][key] += value;
}
}
continue loop;
}
ret[ret.length] = obj = {};
for (key in arr[i]) obj[key] = arr[i][key];
}
return ret;
}
console.dir(merge(arr));
function sumArray(someKeys, sumKeys, arr) {
return arr.reduce((res, cur) => {
const _index = res.findIndex(i => someKeys.reduce((condition, k) => condition && cur[k] === i[k], true));
if(_index > -1) {
sumKeys.forEach(i => {
res[_index][i] += cur[i];
})
} else {
res.push(Object.assign({}, cur));
}
return res;
}, [])
}
// 使用
const arr = [
{
"名称": "商品三",
"数量": 2,
"单价": 12,
"单位": "吨",
"金额": 24
},
{
"名称": "商品一",
"数量": 14,
"单价": 8,
"单位": "吨",
"金额": 112
},
{
"名称": "商品三",
"数量": 10,
"单价": 12,
"单位": "吨",
"金额": 120
},
{
"名称": "商品一",
"数量": 0,
"单价": 8,
"单位": "吨",
"金额": 0
},
{
"名称": "商品三",
"数量": 6,
"单价": 12,
"单位": "吨",
"金额": 72
},
{
"名称": "商品二",
"数量": 18,
"单价": 10,
"单位": "吨",
"金额": 180
},
{
"名称": "商品一",
"数量": 11,
"单价": 8,
"单位": "吨",
"金额": 88
},
{
"名称": "商品二",
"数量": 0,
"单价": 10,
"单位": "吨",
"金额": 0
},
{
"名称": "商品二",
"数量": 13,
"单价": 10,
"单位": "吨",
"金额": 130
},
{
"名称": "商品三",
"数量": 15,
"单价": 12,
"单位": "吨",
"金额": 180
}
]
sumArray(['名称', '单位', '单价'], ['数量', '金额'], arr);
// 结果
/**
[
{
"名称": "商品三",
"数量": 33,
"单价": 12,
"单位": "吨",
"金额": 396
},
{
"名称": "商品一",
"数量": 25,
"单价": 8,
"单位": "吨",
"金额": 200
},
{
"名称": "商品二",
"数量": 31,
"单价": 10,
"单位": "吨",
"金额": 310
}
]
**/
13 回答12.8k 阅读
7 回答1.9k 阅读
3 回答1.1k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
6 回答821 阅读✓ 已解决
6 回答1k 阅读
2 回答1.3k 阅读✓ 已解决