4 回答

TA貢獻1848條經驗 獲得超10個贊
您可以使用javascript的reduce函數
const array = [?
?{ "sku": 123, "val": 10 },
?{ "sku": 124, "val": 12 },
?{ "sku": 123, "val": 20 }
];
const result = [];
array.reduce((res, value) => {
? if (!res[value.sku]) {
? ? res[value.sku] = { "sku": value.sku, "val": 0 };
? ? result.push(res[value.sku])
? }
? res[value.sku].val += value.val;
? return res;
}, {});
console.log(result)

TA貢獻1887條經驗 獲得超5個贊
您應該按 SKU 對條目進行分組,然后將條目映射到 SKU 和減少的值(總和)。
const data = [
{ "sku": 123, "val": 10 },
{ "sku": 124, "val": 12 },
{ "sku": 123, "val": 20 }
];
const groupBy = (arr, key) => arr.reduce((acc, entry) => ({
...acc, [entry[key]]: [ ...(acc[entry[key]] || []), entry ]
}), {});
const sum = Object.entries(groupBy(data, 'sku'))
.map(([key, values]) =>
({
'sku': key,
'val': values.reduce((acc, { val }) => acc + val, 0)
}))
console.log(sum);
.as-console-wrapper { top: 0; max-height: 100% !important; }
這是一個更加動態的版本,允許使用具有各種聚合技術的多個減速器。
const groupBy = (arr, key) => arr.reduce((acc, entry) => ({
...acc, [entry[key]]: [ ...(acc[entry[key]] || []), entry ]
}), {});
const aggregate = (arr, key, reducers) =>
Object.entries(groupBy(arr, key))
.map(([k1, values]) => Object.entries(reducers)
.reduce((obj, [k2, { fn, initial }]) => ({
...obj,
[k2]: values.reduce((acc, item, index, all) =>
fn(acc, item[k2], index, all), initial || 0)
}), { [key]: k1 }))
const data = [
{ "sku": 123, "val": 10, "val2": 2 },
{ "sku": 124, "val": 12, "val2": 5 },
{ "sku": 123, "val": 20, "val2": 8 }
];
const aggregated = aggregate(data, 'sku', {
'val' : { fn: (acc, val) => acc + val, initial: 0 },
'val2' : { fn: (acc, val) => acc * val, initial: 1 }
});
console.log(aggregated);
.as-console-wrapper { top: 0; max-height: 100% !important; }

TA貢獻1780條經驗 獲得超1個贊
跟蹤對象中的總和:
const arr = [
{"sku": 123, "val": 10},
{"sku": 124, "val":12},
{"sku": 123, "val": 20}
];
const sums = {};
for (const {sku, val} of arr) {
if (!(sku in sums)) {
sums[sku] = 0;
}
sums[sku] += val;
}
const result = Object.entries(sums).map(([k, v]) => ({sku: k, val: v}));
console.log(result);

TA貢獻1860條經驗 獲得超8個贊
用于forEach構建一個帶有鍵sku和值進行聚合的對象。從上面的對象中
獲取。Object.values
const group = (arr) => {
const res = {};
arr.forEach(({sku, val}) => {
res[sku] ? (res[sku].val += val) : res[sku] = { sku, val };
});
return Object.values(res);
};
const arr = [
{ sku: 123, val: 10 },
{ sku: 124, val: 12 },
{ sku: 123, val: 20 },
];
console.log(group(arr));
添加回答
舉報