合并相同项目的数量

时间:2013-10-09 11:49:11

标签: javascript loops

我的项目数组的值如下: -

 item[0] A    quantity[0]       10       Category[0]  Alpha    itemtype[0]   Groceries
 item[1] A    quantity[1]       15       Category[1]  Beta     itemtype[1]   Toiletries
 item[2] B    quantity[2]       5        Category[2]  Alpha    itemtype[2]   Stationery

使用Javascript,我想合并相同商品的数量,而且只有少数相同的商品才能显示类别为Alpha的商品类型。新数组的结果应该是:

 item[0] A       quantity[0] 25      category[0] Alpha      itemtype[0]Groceries
 item[1] B       quantity[1] 5       category[1] Alpha      itemtype[1]Stationery

3 个答案:

答案 0 :(得分:0)

尝试类似

的内容
// create JS-objects to collect the values ...
var i,nam,quant={},cat={},ityp={};
for (i=0; i<item.length; i++) {
  nam=item[i];
  // initialise the summation variable to zero first:
  if (typeof quant[nam]=='undefined') quant[nam]=0;
  // do the summation
  quant[nam]+=quantity[i];

  // initialise the string variables too:
  if (typeof ityp[nam]=='undefined') ityp[nam]='';
  if (typeof  cat[nam]=='undefined')  cat[nam]='';
  if (category[i]=='Alpha') { // set the variables, if ...
    ityp[nam]=itemtype[i];
    cat[nam]=category[i];    
  }
}
// destroy original arrays ...
category=[];item=[];quantity=[];itemtype=[];
// ... and build them up again:
for (i in quant) {
  item.push(i);
  quantity.push(quant[i]);
  category.push(cat[i]);
  itemtype.push(ityp[i]);  
}

这种方法不依赖于数组中元素的任何给定顺序。

请参阅此处了解演示:http://jsfiddle.net/CP2cQ/

答案 1 :(得分:0)

for (var i = 0, l = category.length; i < l; i++) {
    if (category[i + 1] !== category[i]) {
        category.splice(i + 1, 1);
        item.splice(i + 1, 1);
        quantity[i] = String(+quantity[i] + +quantity[i + 1]);
        quantity.splice(i + 1, 1);
        itemtype.splice(i + 1, 1);
    }
    i--; l--;
}

Fiddle

您还可以将单独的数组添加到包装器中,并使用forEach(IE9及以上IIRC)遍历该数组:

var arrays = [ category, item , quantity, itemtype ];

for (var i = 0, l = category.length; i < l; i++) {
    if (category[i + 1] !== category[i]) {
        quantity[i] = String(+quantity[i] + +quantity[i + 1]);
        arrays.forEach(function (el) { return el.splice(i + 1, 1); });
    }
    i--; l--;
}

Fiddle

答案 2 :(得分:0)

我认为使用像

这样的对象数组更容易
var items = [
    {item: 'A', quantity: 10, category: 'Alpha', itemtype: 'Groceries'},
    {item: 'A', quantity: 15, category: 'Beta', itemtype: 'Toiletries'},
    {item: 'B', quantity: 5, category: 'Alpha', itemtype: 'Stationery'}
]

然后过滤它

var result = [];
for(var i=0; i<items.length; i++){
    if (items[i].category == "Alpha"){
        result.push(items[i]);
    }
}

result是您的新阵列。