计算数组一个数组属性和按键构造的和



我有一个对象

let returnObj = {
test_on_Home_Page: {
page: 'Home Page',
total_sum: -141.16874354518953,
top_url: null
},
test_on_Product_List: {
page: 'Product List',
total_sum: -147.16874354518953,
top_url: null
},
testOther_on_Home_page: {
page: 'Home Page',
total_sum: -48.16874354518953,
top_url: null
},
}

我想按页计算对象键的total_sum,像这样

{
HomePage : -189.33744
ProductList : -147.168743
}

我试过了

let totalCart = 0;
for(let errorName of Object.keys(returnObj)){
if(returnObj[errorName]['page'] == "Cart"){
totalCart += returnObj[errorName]['total_sum'] 
}
}

但是在我看来这不是动态的

这可以用一行完成吗像这样的

let list = [];

for(let errorName of Object.keys(returnObj)){
list[returnObj[errorName]] += returnObj[errorName]['total_sum']

}

您需要迭代values,而不是keys:

let sums = {}
for (let obj of Object.values(returnObj))
sums[obj.page] = (sums[obj.page] ?? 0) + obj.total_sum

如果你想使用更多的函数式方法

const sums = {}
Object.values(returnObj).forEach(item => {
sums[item.page] = (sums[item.page] ?? 0) + item.total_sum
})

使用lodash库:

const sums = {}
_.values(returnObj).forEach(item => {
sums[item.page] = (sums[item.page] ?? 0) + item.total_sum
})

这是在Object.values(returnObj)上使用Array.prototype.reduce的方法:

const o = {
test_on_Home_Page: {
page: 'Home Page',
total_sum: -141.16874354518953,
top_url: null
},
test_on_Product_List: {
page: 'Product List',
total_sum: -147.16874354518953,
top_url: null
},
testOther_on_Home_page: {
page: 'Home Page',
total_sum: -48.16874354518953,
top_url: null
},
}
const sums = Object.values(o)
.reduce((a, { page: p, total_sum: s }) => ({...a, ...{ [p]: (a[p] ?? 0) + s } }), {});
console.log(sums);

最新更新