【问题标题】:merge object & sum a single property javascript合并对象并求和单个属性 javascript
【发布时间】:2016-10-26 12:33:37
【问题描述】:

我有一个这样的数组

[
  {
    item_guid: "57e7a1cd6a3f3669dc03db58"
    quantity:3
  },
  {
    item_guid: "57e77b06e0566d496b51fed5"
    quantity:3
  },
  {
    item_guid: "57e7a1cd6a3f3669dc03db58"
    quantity:3
   },
  {
    item_guid: "57e77b06e0566d496b51fed5"
    quantity:3
  }
]

我想从中将相似的item_guid 合并到一个对象中,然后像这样总结数量

[
  {
    item_guid: "57e7a1cd6a3f3669dc03db58"
    quantity:6
   },
  {
    item_guid: "57e77b06e0566d496b51fed5"
    quantity:6
  }
]

我知道这可以通过一些循环来实现,但我正在寻找使用 lodash 或 EcmaScript2015 代码的解决方案来让我们的生活更轻松

【问题讨论】:

  • 我的建议是使用 Linq.js 而不是编写自定义方法来实现这个linqjs.codeplex.com

标签: javascript lodash


【解决方案1】:

一个简单的方法:

循环数据并创建一个对象,其中键是唯一的 id,其值是数量。然后循环返回对象的键并创建对象。

var data = [{ item_guid: "57e7a1cd6a3f3669dc03db58", quantity: 3 }, { item_guid: "57e77b06e0566d496b51fed5", quantity: 3 }, { item_guid: "57e7a1cd6a3f3669dc03db58", quantity: 3 }, { item_guid: "57e77b06e0566d496b51fed5", quantity: 3 }]

var r = {};
data.forEach(function(o){
  r[o.item_guid] = (r[o.item_guid] || 0) + o.quantity;
})

var result = Object.keys(r).map(function(k){
  return { item_guid: k, quantity: r[k] }
});
console.log(result)

【讨论】:

    【解决方案2】:

    纯 Javascript 的解决方案,带有 item_guid 的哈希表。

    var data = [{ item_guid: "57e7a1cd6a3f3669dc03db58", quantity: 3 }, { item_guid: "57e77b06e0566d496b51fed5", quantity: 3 }, { item_guid: "57e7a1cd6a3f3669dc03db58", quantity: 3 }, { item_guid: "57e77b06e0566d496b51fed5", quantity: 3 }],
        grouped = data.reduce(function (hash) {
            return function (r, a) {
                (hash[a.item_guid] = hash[a.item_guid] || r[r.push({ item_guid: a.item_guid, quantity: 0 }) - 1]).quantity += a.quantity;
                return r;
            };
        }(Object.create(null)), []);
    
    console.log(grouped);

    ES6

    var data = [{ item_guid: "57e7a1cd6a3f3669dc03db58", quantity: 3 }, { item_guid: "57e77b06e0566d496b51fed5", quantity: 3 }, { item_guid: "57e7a1cd6a3f3669dc03db58", quantity: 3 }, { item_guid: "57e77b06e0566d496b51fed5", quantity: 3 }],
        grouped = data.reduce((map => (r, a) => {
            map.set(a.item_guid, map.get(a.item_guid) || r[r.push({ item_guid: a.item_guid, quantity: 0 }) - 1]);
            map.get(a.item_guid).quantity += a.quantity;
            return r;
        })(new Map), []);
    
    console.log(grouped);

    【讨论】:

      【解决方案3】:

      你可以

      • item_guid 对您的对象进行分组
      • 对结果组中的对象求和
      • 将这些组转换为您想要的格式

      类似这样的:

      var result = _.chain(data)
          .groupBy('item_guid')
          .map(function(objects, guid) {
              return {
                  item_guid: guid, 
                  quantity: _.sumBy(objects, 'quantity')
              };
          })
          .value();
      

      还有一个演示

      var data = [
        {
          item_guid: "57e7a1cd6a3f3669dc03db58",
          quantity:3
        },
        {
          item_guid: "57e77b06e0566d496b51fed5",
          quantity:3
        },
        {
          item_guid: "57e7a1cd6a3f3669dc03db58",
          quantity:3
         },
        {
          item_guid: "57e77b06e0566d496b51fed5",
          quantity:3
        }
      ];
      
      
      var result = _.chain(data)
          .groupBy('item_guid')
          .map(function(objects, guid) {
              return {
                  item_guid: guid, 
                  quantity: _.sumBy(objects, 'quantity')
              };
          })
          .value();
        
        console.log(result);
      <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>

      【讨论】:

        【解决方案4】:
        var groupedItems = [];
        
        var totalItems = [{item_guid: "57e7a1cd6a3f3669dc03db58", quantity:3},{item_guid: "57e77b06e0566d496b51fed5",quantity:3}, { item_guid: "57e7a1cd6a3f3669dc03db58", quantity:3 }, { item_guid: "57e77b06e0566d496b51fed5", quantity:3}];
        
        totalItems.forEach((e) => {
          if (groupedItems.findIndex(x => x.item_guid === e.item_guid) < 0) {
            let totalQuantity = totalItems
                               .filter(x => x.item_guid === e.item_guid)
                               .map(x => x.quantity)
                               .reduce(function(a, b) { return a + b;});
        
            groupedItems.push({item_guid: e.item_guid, quantity: totalQuantity})
          }
        })
        
        console.log(groupedItems);
        

        【讨论】:

          猜你喜欢
          • 2020-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-05
          • 1970-01-01
          • 1970-01-01
          • 2012-12-01
          • 2020-07-05
          相关资源
          最近更新 更多