我有一个对象
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);