Javascript 筛选唯一数组值和和值
我有以下js数组: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
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);