【问题标题】:Calculate object property values based on user id根据用户 id 计算对象属性值
【发布时间】:2018-02-18 21:31:29
【问题描述】:

得到一个包含每个用户的用户 ID 和价格的对象,想为每个用户创建一个新的对象/数组(不重复),并能够计算每个用户的价格总和。尝试将 Object.values() 与 map 和 filter 一起使用,但无法正常工作

{
     "data": {
         "item1": {
             "price": "20",
             "user": "user1"
         },
         "item2": {
             "price": "10",
             "user": "user2"
         },
         "item3": {
             "price": "50",
             "user": "user1"
         }
     }
}

输出如下:

{
     "users": {
         "user1": {
             "totalSum": "70",
         },
         "user2": {
             "totalSum": "10",
         }
     }
}

我正在考虑使用地图来呈现“用户”数据,也许数组会更好?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    使用函数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;
    }

    【讨论】:

      【解决方案2】:

      你可以利用```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
      }
      

      【讨论】:

        【解决方案3】:

        您可以使用 forEach 循环。这依赖于 Javascript 强大的 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"]);
        })
        

        【讨论】:

          猜你喜欢
          • 2021-02-04
          • 1970-01-01
          • 1970-01-01
          • 2017-06-07
          • 1970-01-01
          • 2021-11-30
          • 2017-03-22
          • 2022-11-20
          • 1970-01-01
          相关资源
          最近更新 更多