我有一个如下的数组。
[ { sku: 'TEA-BLCK', price: '10', quantity: '1' },
{ sku: 'TEA-ELGY', price: '10', quantity: '1' },
{ sku: 'TEA-CHAI', price: '10', quantity: '1' },
{ sku: 'TEA-GREN', price: '10', quantity: '1' },
{ sku: 'TEA-ELGY', price: '10', quantity: '1' },
{ sku: 'TEA-MINT', price: '10', quantity: '1' } ]
我需要让它看起来像这样
[ { sku: 'TEA-BLCK', price: '10', quantity: '1' },
{ sku: 'TEA-ELGY', price: '10', quantity: '2' },
{ sku: 'TEA-CHAI', price: '10', quantity: '1' },
{ sku: 'TEA-GREN', price: '10', quantity: '1' },
{ sku: 'TEA-MINT', price: '10', quantity: '1' } ]
到目前为止,我使用reduce
来制作此underscore.js
函数。
var reduce = function(){
return _.reduce(line_items, function(quant, item) {
quant[item.sku] = (typeof(quant[item.sku]) !== "undefined") ? quant[item.sku] : 0 ;
quant[item.sku] = parseFloat(item.quantity) + quant[item.sku];
return quant;
}, {});
}
其中吐出以下内容。
{ 'TEA-BLCK': 1,
'TEA-ELGY': 1,
'TEA-CHAI': 2,
'TEA-GREN': 1,
'TEA-MINT': 1 }
这是减少的好工作吗?我怎么能按照我想要的方式得到它?
答案 0 :(得分:3)
尝试这样的事情:
var line_items = [
{ sku: 'TEA-BLCK', price: '10', quantity: 2 },
{ sku: 'TEA-ELGY', price: '10', quantity: 3 },
{ sku: 'TEA-CHAI', price: '10', quantity: 1 },
{ sku: 'TEA-GREN', price: '10', quantity: 1 },
{ sku: 'TEA-ELGY', price: '10', quantity: 1 },
{ sku: 'TEA-MINT', price: '10', quantity: 1 }
];
// Group items by sku.
var line_items_by_sku = _(line_items).groupBy(function (item) { return item.sku; });
// Get the new line_items array based on the grouped data.
line_items = _(line_items_by_sku).map(function (items) {
var item = items[0];
item.quantity = _.reduce(items, function(memo, item){ return memo + item.quantity; }, 0);
return item;
});
请参阅this jsfiddle。
答案 1 :(得分:2)
这样的简单解决方案怎么样:
function reduce(array) {
var out = [];
var indexBySku = {};
for (var i = array.length; i--;) {
if (!indexBySku[array[i].sku]) {
indexBySku[array[i].sku] = out.length;
out.push(array[i]);
} else {
out[indexBySku[array[i].sku]].quantity -= -array[i].quantity;
}
}
return out;
}
这里唯一需要解释的是我们减去负数而不是添加的行。这只是为了避免字符串连接,因为“数量”中的值是字符串。
超级浓缩版,删除不需要的大括号和分号......只是为了好玩。将订单和数量保留为字符串,与数量一起使用!= 1。
function reduce(array) {
var out = [], indexBySku = {}, len = array.length, i, j
for (i = 0; i < len; i++)
(j = indexBySku[array[i].sku]) ?
out[j].quantity = out[j].quantity - -array[i].quantity + '' :
indexBySku[array[i].sku] = out.push(array[i]) - 1
return out
}
答案 2 :(得分:1)
我参加派对有点晚了,但听起来很有趣,所以......
JSON.stringify(
[ { sku: 'TEA-BLCK', price: '10', quantity: '1' },
{ sku: 'TEA-ELGY', price: '10', quantity: '1' },
{ sku: 'TEA-CHAI', price: '10', quantity: '1' },
{ sku: 'TEA-GREN', price: '10', quantity: '1' },
{ sku: 'TEA-ELGY', price: '10', quantity: '1' },
{ sku: 'TEA-MINT', price: '10', quantity: '1' } ].sort( function (a, b) {
return a.sku < b.sku;
} ).reduce( function (a,v) {
if ( !a[0] || a[0].sku !== v.sku ) {
a.unshift(v);
} else {
// notice the very inefficient str -> number -> str conversion
a[0].quantity = 1*a[0].quantity + 1*v.quantity + '';
}
return a;
}, []) );
这里我们对数组进行预排序,然后将元素添加到累加器的开头。 GGG已经谈过字符串了。
答案 3 :(得分:1)
有点迟了,但很有趣 http://jsbin.com/amazat/2/
line_items_reduced = _.map(reduce(), function(value, key) {
var line_item = _.find(line_items, function(line_i){
return (key === line_i.sku);
});
line_item.quantity = value;
return line_item;
});
答案 4 :(得分:1)
这更新了benekastah的答案并处理超过1的数量...... 但我确实冒昧地将数量改为整数
var line_items = [
{ sku: 'TEA-BLCK', price: '10', quantity: 2 },
{ sku: 'TEA-ELGY', price: '10', quantity: 3 },
{ sku: 'TEA-CHAI', price: '10', quantity: 1 },
{ sku: 'TEA-GREN', price: '10', quantity: 1 },
{ sku: 'TEA-ELGY', price: '10', quantity: 1 },
{ sku: 'TEA-MINT', price: '10', quantity: 1 }
];
// Group items by sku.
var line_items_by_sku = _(line_items).groupBy(function (item) { return item.sku; });
// Get the new line_items array based on the grouped data.
line_items = _(line_items_by_sku).map(function (items) {
var item = items[0];
item.quantity = _.reduce(items, function(memo, item){ return memo + item.quantity; }, 0);
return item;
});
document.write("<pre>"+JSON.stringify(line_items, null, " ")+"</pre>");
答案 5 :(得分:0)
从技术上讲,这是完整的答案。从字符串到字符串。对不起伙计们。
var line_items = [
{ sku: 'TEA-BLCK', price: '10', quantity: "2" },
{ sku: 'TEA-ELGY', price: '10', quantity: "3" },
{ sku: 'TEA-CHAI', price: '10', quantity: "1" },
{ sku: 'TEA-GREN', price: '10', quantity: "1" },
{ sku: 'TEA-ELGY', price: '10', quantity: "1" },
{ sku: 'TEA-MINT', price: '10', quantity: "1" }
];
// Group items by sku.
var line_items_by_sku = _(line_items).groupBy(function (item) { return item.sku; });
// Get the new line_items array based on the grouped data.
line_items = _(line_items_by_sku).map(function (items) {
var item = items[0];
item.quantity = _.reduce(items, function(memo, item){ return memo + parseFloat(item.quantity); }, 0);
item.quantity = item.quantity.toString();
return item;
});
document.write("<pre>"+JSON.stringify(line_items, null, " ")+"</pre>");