按键组合数组中的项目

Combine items in array by their key

本文关键字:项目 数组 组合      更新时间:2023-09-26

我正在使用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的所有项目,获取其item_amt属性的总和,然后将它们组合在一起,仅显示一个具有总计的行项目。

我对从哪里开始以及在哪里做这件事有点迷茫。目前,此返回来自模型钩子中的路由,因此我知道我可以在实际设置模型之前进行任何需要的处理。但是,我想确保我保持原始项目完好无损(因为我需要知道唯一的raffle_purchase_id),以便以后用户为这些项目付费。

您可以使用 for 循环遍历数组并将具有相同purchase_id的所有项目添加到另一个数组中,然后循环遍历新数组并通过将该值添加到变量sum来查找每个项目item_amt的总和?

您可以遍历它们并将总和放入地图中,由它们的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);
}

工作代码笔查看控制台以查看地图的值

您可以使用

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>');

您可以使用地图缩减或变得聪明,但这样的事情很简单,似乎有效:

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);
});