有一个对象包含每个用户和价格的用户ID,想为每个用户创建一个新的对象/数组(没有重复项),并且能够计算每个用户的总价格总和。尝试使用带有地图和过滤器的Object.values(),但无法使其正常工作
{
"data": {
"item1": {
"price": "20",
"user": "user1"
},
"item2": {
"price": "10",
"user": "user2"
},
"item3": {
"price": "50",
"user": "user1"
}
}
}
输出如下内容:
{
"users": {
"user1": {
"totalSum": "70",
},
"user2": {
"totalSum": "10",
}
}
}
我正在考虑使用地图来呈现"用户" -data,也许数组会更好?
答案 0 :(得分:2)
使用函数reduce
。
重要提示:属性price
是一个字符串,此方法使用对象Number
将该值转换为数字值。
var obj = { "data": { "item1": { "price": "20", "user": "user1" }, "item2": { "price": "10", "user": "user2" }, "item3": { "price": "50", "user": "user1" } }};
var result = Object.keys(obj.data).reduce((a, k) => {
if (a.users[obj.data[k].user]) {
a.users[obj.data[k].user].totalSum += Number(obj.data[k].price);
} else {
a.users[obj.data[k].user] = {
"totalSum": Number(obj.data[k].price)
}
}
return a;
}, {
'users': {}
});
console.log(result);
.as-console-wrapper {
max-height: 100% !important; top: 0;
}
答案 1 :(得分:0)
你可以利用```reduce,更多信息here
代码(没有试过这个)
var data = JSON.parse(mainObj).data;
var usersWithTotalExpenditure = Object.keys(data).reduce(function(result, key) {
var currentItem = data[key];
var useName = currentItem.user;
var price = Number(currentItem.price);
if (userName in result) {
result[userName].totalSum += price;
} else {
result[userName] = {
totalSum: price
};
}
return result;
}, {});
var resultObject = {
users: usersWithTotalExpenditure
}
答案 2 :(得分:0)
您可以使用forEach循环。这依赖于Javascripts强大的OR运算符,如果当前用户的价格没有定义(意味着它是以前没有遇到过的用户),它会将表达式的前半部分强制为false。
`c is your initial object's data, output is empty object`
const c = obj.data;
var output = {};
Object.keys(c).forEach((val) => {
output[c[val]["user"]] = parseInt(output[c[val]["user"]]) + parseInt(c[val]["price"]) || parseInt(c[val]["price"]);
})