按键组合数组中的项目

时间:2016-01-27 16:35:34

标签: javascript arrays ember.js

我正在使用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,在这种情况下,这三个(可能更多)商品的商品ID相同,并且可能会有多次其他同一商品的购买,我想做同样的事情到。

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

我在这个问题上有点失落,关于从哪里开始以及在何处开始。目前这个返回来自模型钩子中的路径,所以我知道在实际设置模型之前我可以做任何我需要的处理。但是我想确保原始项目保持原样(因为我需要知道独特的raffle_purchase_id),以便以后用户为此付费。

4 个答案:

答案 0 :(得分:1)

您是否可以使用 $finalFile = ""; /** Load $inputFileName to a PHPExcel Object **/ $objPHPExcel = PHPExcel_IOFactory::load($inputFileName); foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) { $worksheet->insertNewColumnBefore('A', 1); //To insert a single new column before column A: foreach($worksheet->getRowIterator() as $row) { $worksheet->setCellValue('A'.$row, 'AFS-' . $worksheet->getCell("B".$row)->getValue()); } } $convertedFileName = "converted-file". $date->getTimestamp().".xlsx"; $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); $objWriter->save($directory . $convertedFileName); 循环遍历数组并将与所有硬编码参数相同的for的所有项添加到另一个数组中,然后遍历新数组并找到通过将该值添加到变量purchase_id

,每个item_amt的总和

答案 1 :(得分:1)

你可以循环它们并将总和放在一个地图中,由它们的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查看控制台以查看地图的值

答案 2 :(得分:1)

您可以使用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>');

答案 3 :(得分:1)

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

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