Javascript 筛选唯一数组值和和值

Javascript 筛选唯一数组值和和值,javascript,jquery,arrays,filtering,Javascript,Jquery,Arrays,Filtering,我有以下js数组: for(var j = 0; j < array.length; j++){ arr.push([array[j][0],array[j][1],array[j][2]]); } 我一直试图做的是过滤唯一的产品编号数组[j][0],如果有多个,我可以通过执行以下操作来进行唯一过滤,并对数量数组[j][2]求和: for(var o = 0; o < arr.length; o++){ if (!n[arr[o][1]]){ n[arr[o][1

我有以下js数组:

for(var j = 0; j < array.length; j++){
  arr.push([array[j][0],array[j][1],array[j][2]]);
}
我一直试图做的是过滤唯一的产品编号数组[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重复出现,我只需显示一次,并将具有相同产品编号的其他产品的数量相加。

var productIndex={};
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]);
  }
}
var结果=[]; 对于(变量i=0;i
我相信有更好的方法。但我只是将其更改为一个对象,添加它们,然后将其更改回一个数组。给你:

var a=[[12345,“产品”,“10”],[12345,“产品”,“15”],[1234567,“其他”,“10”];
var b={};
var c=[];
对于(变量i=0;i);
$('#console').append(JSON.stringify(b)+'
'; $('#console').append(c.toString()); });
结果:

[ [ 12345, 'product', 25 ], [ 1234567, 'other', 10 ] ]
reduce()
方法对累加器和数组的每个值(从左到右)应用一个函数,将其减少为单个值

请参见

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

//first we sort the array by id
//@pv = previous value; @cv = current value
list.sort(function(pv, cv) {
    var a = +pv[0],
        b = +cv[0];
    return a - b;
});

//reduce the array for repeated elements
//@pv = previous value; @cv = current value
var reduced = list.reduce(function (pv, cv) {
    //slice keeps reference when element is an object/array
    var last = pv.slice(-1)[0];
    if (last === undefined) return [cv];
    //compares the id
    if (last[0] == cv[0]) 
        last[2] = +last[2] + (+cv[2]); //sums values
    else pv.push(cv); //order elements
    return pv;
}, []); //[] initial value for @pv

console.log(reduced);

为了完成这些可能性,这里提供了一个带有临时对象的解决方案,该对象隐藏在
this

var数据=[[12345,“产品”,“10”],[12345,“产品”,“15”],[1234567,“其他”,“10”],
结果=功能(数据){
var r=[];
data.forEach(函数(a){
如果(!此[a[0]]){
这[a[0]=[a[0],a[1],0];
r、 推(这个[a[0]]);
}
这个[a[0]][2]+=+a[2];
}, {});
返回r;
}(数据);

document.write(“”+JSON.stringify(结果,0,4)+“”)
那么你想要一个产品ID及其运行总数的散列?是的,过滤出唯一的数字并将总数@DaveNewton相加(这是提示:使用散列跟踪ID,当你使用现有数组迭代一个项目时,进行数学运算;当你找到一个没有值的ID时,用价格创建一个新条目。)您是否考虑过将此业务逻辑移到后端?在生产系统中,编写查询以实现所需目标将更容易、更高效。@NicholasByfleet我猜这是一项任务,因此不重要。我可以看出您将如何处理此问题,这是有意义的。我没能让它工作,但你有什么问题?它适用于您的示例数组。我的错误是将===替换为==这很有效!!谢谢
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());
});
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 ] ]
var list = [[12345, "product", "10"], [12345, "product", "15"], [1234567, "other", "10"], [12345, "product", "5"]];

//first we sort the array by id
//@pv = previous value; @cv = current value
list.sort(function(pv, cv) {
    var a = +pv[0],
        b = +cv[0];
    return a - b;
});

//reduce the array for repeated elements
//@pv = previous value; @cv = current value
var reduced = list.reduce(function (pv, cv) {
    //slice keeps reference when element is an object/array
    var last = pv.slice(-1)[0];
    if (last === undefined) return [cv];
    //compares the id
    if (last[0] == cv[0]) 
        last[2] = +last[2] + (+cv[2]); //sums values
    else pv.push(cv); //order elements
    return pv;
}, []); //[] initial value for @pv

console.log(reduced);