过滤唯一的数组值和总和值

时间:2016-03-10 22:27:55

标签: javascript jquery arrays filtering

我有以下js数组:

for(var j = 0; j < array.length; j++){
  arr.push([array[j][0],array[j][1],array[j][2]]);
}

它转化为:

数字,类型,数量

[[12345, "product", "10"],[12345, "product", "15"],[1234567, "other", "10"]]

我一直在尝试过滤唯一的产品编号 array [j] [0] 并将数量数组[j] [2] 相加如果有多个,我可以通过执行以下操作来执行唯一过滤器:

for(var o = 0; o < arr.length; o++){
  if (!n[arr[o][1]]){
     n[arr[o][1]] = true
     r.push(arr[o]);
  }
}

我希望你的帮助可以解决这个问题。我期望实现的目标是这样的:

[[12345, "product", "25"],[1234567, "other", "10"]]

由于重复了产品12345,我只需要显示一次,并将其他产品的数量与相同的产品编号相加。

5 个答案:

答案 0 :(得分:1)

var productIndex = {};
var result = [];
for (var i = 0; i < arr.length; i++) {
  var productId = arr[i][0];
  if (productIndex[productId] === undefined) {
    productIndex[productId] = result.length;
    result.push(arr[i]);
  } else {
    var index = productIndex[productId];
    result[index][2] = String(+result[index][2] + +arr[i][2]);
  }
}

答案 1 :(得分:0)

我相信有更好的方法。但我只是将其更改为一个对象,添加它们并将其更改回一个数组。你走了:

https://jsfiddle.net/ct6to1Lv/

var a = [[12345, "product", "10"],[12345, "product", "15"],[1234567, "other", "10"]];
var b = {};
var c = [];

for(var i = 0; i < a.length; i++) {
    if(!b.hasOwnProperty(a[i][0])) {
    b[a[i][0]] = {};
    b[a[i][0]]['qty'] = 0;
  }
  b[a[i][0]]['id'] = a[i][0];
  b[a[i][0]]['name'] = a[i][1];
    b[a[i][0]]['qty'] += parseInt(a[i][2]);
}

for(key in b) {
    c[c.length] = [b[key]['id'], b[key]['name'], b[key]['qty']];
}

$(function(){
$('#console').append(a.toString()+'<br />');
$('#console').append(JSON.stringify(b)+'<br />');
$('#console').append(c.toString());
});

答案 2 :(得分:0)

var arr = [[12345, "product", "10"],[12345, "product", "15"],[1234567, "other", "10"]];

var obj = {};

arr.forEach(function(e){
    var t = e[0];
    if(obj[t]) {
        obj[t][2] += +e[2];
    } else {
        t = [];
        t[0] = e[0];
        t[1] = e[1];
        t[2] = +e[2];
        obj[e[0]] = t;
    }
});

var res = [];

Object.keys(obj).forEach(function(k) {
    res.push(obj[k]);
});

console.log(res);

结果:

[ [ 12345, 'product', 25 ], [ 1234567, 'other', 10 ] ]

答案 3 :(得分:0)

[$mobx: Object] 0: (...) 1: (...) 2: (...) 3: (...) 4: (...) 5: (...) 6: (...) 7: (...) 8: (...) 9: (...) 10: (...) 11: (...) 12: (...) 13: (...) 14: (...) 15: (...) 16: (...) 17: (...) ... 999: (...) 方法对累加器和数组的每个值(从左到右)应用函数以将其减少为单个值。

参见 Array.prototype.reduce() Array.prototype.sort()

reduce()

答案 4 :(得分:0)

为了完成可能性,这里是一个临时对象的解决方案,隐藏在this中。

&#13;
&#13;
var data = [[12345, "product", "10"], [12345, "product", "15"], [1234567, "other", "10"]],
    result = function (data) {
        var r = [];
        data.forEach(function (a) {
            if (!this[a[0]]) {
                this[a[0]] = [a[0], a[1], 0];
                r.push(this[a[0]]);
            }
            this[a[0]][2] += +a[2];
        }, {});
        return r;
    }(data);

document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
&#13;
&#13;
&#13;

相关问题