根据用户ID计算对象属性值

时间:2018-02-18 21:31:30

标签: javascript

有一个对象包含每个用户和价格的用户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,也许数组会更好?

3 个答案:

答案 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"]);
})