【问题标题】:Combine items in array by their key通过键组合数组中的项目
【发布时间】:2016-05-04 17:38:54
【问题描述】:

我正在使用 Ember Data 为购物车获取一些物品。这些项目可能看起来像这样

[
  {
    "item_id":"5635",
    "raffle_purchase_id":"1060",
    "item_name":"***",
    "item_desc":"***",
    "item_image":"5635-Ilbt8xNGsD-cropped.png",
    "item_amt":"2",
    "item_type":"raffle"
  },
  {
    "item_id":"5635",
    "raffle_purchase_id":"1061",
    "item_name":"***",
    "item_desc":"***",
    "item_image":"5635-Ilbt8xNGsD-cropped.png",
    "item_amt":"4",
    "item_type":"raffle"
  },
  {
    "item_id":"5635",
    "raffle_purchase_id":"1563",
    "item_name":"***",
    "item_desc":"***",
    "item_image":"5635-Ilbt8xNGsD-cropped.png",
    "item_amt":"2",
    "item_type":"raffle"
  },
  ...
]

这里的每件商品都有一个不同的购买 ID,我需要在服务器端更新它,因此我需要将所有要更新的商品发回服务器。但是,当我显示这些时,我不想一遍又一遍地显示同一购买的每一行。相反,我想结合这些并计算这些购买成本的总和。

每件商品都有一个商品 ID,在这种情况下,这 3 件(可能还有更多)商品的 ID 相同,并且可能有多次购买同一商品的其他商品,我想多次购买相同的商品到。

基本上我需要在这里获取所有具有相同 ID 的项目,获取它们的 item_amt 属性的总和,然后将它们组合起来,只显示一个行项目的总数。

我对从哪里开始以及在哪里做这件事有点迷茫。目前这个回报来自模型钩子中的路线,所以我知道在实际设置模型之前我可以做任何我需要做的处理。不过,我想确保我保留原始物品完好无损(因为我需要知道唯一的 raffle_purchase_id's),以便以后用户支付这些物品时使用。

【问题讨论】:

    标签: javascript arrays ember.js


    【解决方案1】:

    您能否使用for 循环遍历数组并将具有相同purchase_id 的所有项作为某个硬编码参数添加到另一个数组,然后循环遍历新数组并找到@ 的总和987654323@ 通过将该值添加到变量sum?

    【讨论】:

    • 这是我目前的第一个想法,看起来很乱,但现在可能必须这样做,我想可能有更方便的方法,但可能没有。
    【解决方案2】:

    您可以遍历它们并将总和放入由它们的 item_id 映射的地图中:

    var returnedJSON = [
    {
        "item_id":"5635",
        "raffle_purchase_id":"1060",
        "item_name":"***",
        "item_desc":"***",
        "item_image":"5635-Ilbt8xNGsD-cropped.png",
        "item_amt":"2",
        "item_type":"raffle"
      },
      {
        "item_id":"5635",
        "raffle_purchase_id":"1061",
        "item_name":"***",
        "item_desc":"***",
        "item_image":"5635-Ilbt8xNGsD-cropped.png",
        "item_amt":"4",
        "item_type":"raffle"
      },
      {
        "item_id":"5635",
        "raffle_purchase_id":"1563",
        "item_name":"***",
        "item_desc":"***",
        "item_image":"5635-Ilbt8xNGsD-cropped.png",
        "item_amt":"2",
        "item_type":"raffle"
      }
    ];
    var itemTotals = {};
    for(var i = 0; i < returnedJSON.length; i++) {
      if(!itemTotals[returnedJSON[i].item_id]) {
       itemTotals[returnedJSON[i].item_id] = 0;
      }
      itemTotals[returnedJSON[i].item_id] += Number(returnedJSON[i].item_amt);
    }
    

    Working CodePen查看控制台查看map的值

    【讨论】:

      【解决方案3】:

      您可以使用Array.prototype.reduce() 并收集对象中的所有总和:

      var data = [{ "item_id": "5635", "raffle_purchase_id": "1060", "item_name": "***", "item_desc": "***", "item_image": "5635-Ilbt8xNGsD-cropped.png", "item_amt": "2", "item_type": "raffle" }, { "item_id": "5635", "raffle_purchase_id": "1061", "item_name": "***", "item_desc": "***", "item_image": "5635-Ilbt8xNGsD-cropped.png", "item_amt": "4", "item_type": "raffle" }, { "item_id": "5635", "raffle_purchase_id": "1563", "item_name": "***", "item_desc": "***", "item_image": "5635-Ilbt8xNGsD-cropped.png", "item_amt": "2", "item_type": "raffle" }, ],
          sum = data.reduce(function (r, a) {
              r[a.item_id] = (r[a.item_id] || 0) + +a.item_amt;
              return r;
          }, {});
      document.write('<pre>' + JSON.stringify(sum, 0, 4) + '</pre>');

      【讨论】:

        【解决方案4】:

        您可以使用 map reduce 或变得聪明,但这样的事情很简单而且似乎有效:

        var processed = {};
        items.forEach(function(item) {
            if(!processed.item_id) {
                processed.item_id = {
                    item_id: item.item_id,
                    item_amt: 0
                }
            }
            processed.item_id.item_amt += parseInt(item.item_amt);
        });
        

        【讨论】:

          猜你喜欢
          • 2012-04-28
          • 1970-01-01
          • 2018-09-11
          • 2015-11-06
          • 2011-12-05
          • 2014-10-01
          • 1970-01-01
          • 2011-01-13
          • 2022-10-15
          相关资源
          最近更新 更多