按键组合数组中的项目
Combine items in array by their key
我正在使用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);
});
相关文章:
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 按不同项目对对象数组进行排序
- 使用JavaScript或jQuery检查单选按钮选择是否与数组中的项目匹配
- JS:从整个数组中每次得到5个项目,并得到平均值
- 使用圆中的数组更改背景颜色项目
- 编辑CSV数组中的项目-快速CSV node.js
- 我可以限制我添加到数组中的项目数量吗
- 使用javascript/jquery从现有数组中创建一个新数组,该数组保存项目存在的次数
- 什么's JavaScript数组中项目的作用域
- 将项目放入数组中
- 使用 id 和 Javascript 从数组中删除项目
- (角度.js)如何通过过滤器计算数组中有多少项目
- 如何通过迭代对象数组来删除某些项目
- Lodash 从与值数组不匹配的数组中获取项目
- 发布要形成的 n 个项目的数组
- 查找数组中项目包含子字符串的索引
- 使用节点在 JSON 数组中搜索项目(最好不迭代)
- Javascript:从数组中删除包含带有侦听器的对象的项目的最佳方法
- 更新挖空中可观察数组中项目的属性
- JavaScript:如何在 for 循环期间跳过数组中的当前项目?(继续?