2016-03-08 75 views
2

我有以下数组,我需要计算每个组的值的总和。我可以得到每个组的第一个值在数组dataArr [1]中的总和,但是我还需要为数组中的每个组获得第二个值的总和,即dataArr [2]。JavaScript和多维数组元素值

var dataArr = [ [ 
    "Group One", 
    1, 
    1 
], 
[ 
    "Group Four", 
    0, 
    1 
], 
[ 
    "Group Three", 
    0, 
    1 
], 
[ 
    "Group Three", 
    1, 
    0 
], 
[ 
    "Group Four", 
    0, 
    1 
], 
[ 
    "Group Two", 
    2, 
    1 
], 
[ 
    "Group Four", 
    1, 
    0 
], 
[ 
    "Group Three", 
    0, 
    1 
], 
[ 
    "Group Three", 
    0, 
    1 
], 
[ 
    "Group One", 
    1, 
    0 
], 
[ 
    "Group Three", 
    0, 
    1 
], 
[ 
    "Group Two", 
    1, 
    0 
] 
]; 

如何计算第二值之和产生一个多维数组类似如下:

[["Group One", 2, 1], ["Group Four", 1, 2], ["Group Three", 1, 4], ["Group Two", 3, 1]]

下面是here激发了我的代码:

var result = []; 

$(dataArr).each(function() { 
    var key = this[0]; 
    var value = this[1]; 

    if (result[key]) { 
     result[key] += value;  
    } else { 
     result[key] = value; 
    } 
}); 

回答

2

这提议使用临时对象来引用结果数组。

var dataArr = [["Group One", 1, 1], ["Group Four", 0, 1], ["Group Three", 0, 1], ["Group Three", 1, 0], ["Group Four", 0, 1], ["Group Two", 2, 1], ["Group Four", 1, 0], ["Group Three", 0, 1], ["Group Three", 0, 1], ["Group One", 1, 0], ["Group Three", 0, 1], ["Group Two", 1, 0]], 
 
    result = function (data) { 
 
     var r = [], o = {}; 
 
     data.forEach(function (a) { 
 
      if (!o[a[0]]) { 
 
       o[a[0]] = [a[0], 0, 0]; 
 
       r.push(o[a[0]]); 
 
      } 
 
      o[a[0]][1] += a[1]; 
 
      o[a[0]][2] += a[2]; 
 
     }); 
 
     return r; 
 
    }(dataArr); 
 
    
 
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

+1

出色@nina –

+1

谢谢你提醒我使用的一个片段。 :) – Phrogz

+1

Thanks @ nina-scholz,你的解决方案帮助解决了我的问题。 – ManUO

0
  1. 使用的对象,而不是阵列来追踪自定义属性。
  2. 而不是每个键的单个值,每个键使用一个数组。现在,您可以支持每个对象1个,2个或47个值。
  3. 如果将来有超过2个值,我建议使用for循环来统一处理它们。

var dataArr = [["Group One",1,1],["Group Four",0,1],["Group Three",0,1], 
 
       ["Group Three",1,0],["Group Four",0,1],["Group Two",2,1], 
 
       ["Group Four",1,0],["Group Three",0,1],["Group Three",0,1], 
 
       ["Group One",1,0],["Group Three",0,1],["Group Two",1,0]]; 
 

 
var sumByKey = {}; 
 
dataArr.forEach(function(item){ 
 
    var key = item[0]; 
 
    if (!sumByKey[key]) sumByKey[key] = []; 
 
    for (var i=0;i<2;++i){ 
 
    sumByKey[key][i] = (sumByKey[key][i] || 0) + item[i+1]; 
 
    } 
 
}); 
 

 
var output = neatJSON(sumByKey,{wrap:30,short:true,aligned:true}); 
 
document.querySelector('pre').innerHTML = output;
<script src="http://phrogz.net/JS/neatjson/neatjson.js"></script> 
 
<pre></pre>

0

随着mapreduce和方法:

var reduced = dataArr.reduce(function(obj,item) { 
    if(obj.hasOwnProperty(item[0])) { 
    obj[item[0]][0] += item[1] 
    obj[item[0]][1] += item[2] 
    } else { 
    obj[item[0]] = [] 
    obj[item[0]][0] = item[1] 
    obj[item[0]][1] = item[2] 
    } 
    return obj; 
}, {}); 
var grouped = Object.keys(reduced).map(function(item) { 
    return [item, reduced [item][0], reduced [item][1]] 
}); 
1

Array.forEachObject.keysArray.map方法:

var keys_obj = {}, key; 
dataArr.forEach(function(v){ 
    key = v[0]; 
    if (! (key in keys_obj)) { 
     keys_obj[key] = [v[1], v[2]]; 
    } else { 
     keys_obj[key][0] += v[1]; 
     keys_obj[key][1] += v[2]; 
    } 
}); 

var result = []; 
result = Object.keys(keys_obj).map(function(v){ 
    return [v, keys_obj[v][0], keys_obj[v][1]]; 
}); 

console.log(result); 

// the output: 
[["Group Four", 1, 2], ["Group Three", 1, 4], ["Group One", 2, 1], ["Group Two", 3, 1]] 
+0

为了减少一些括号的疯狂,我个人建议保留'key'变量。 – Phrogz

+0

@Progrog,为了方便添加了'key'变量 – RomanPerekhrest

0

随着对象和Array.prototype.forEach()方法

var o = {}; 
dataArr.forEach(function(e) { 
    var t = o[e[0]]; 
    if (t) { 
     t.first += e[1]; 
     t.second += e[2]; 
    } else { 
     t = {}; 
     t.first = e[1]; 
     t.second = e[2]; 
     o[e[0]] = t; 
    } 
}); 

用法:

console.log(o["Group Four"].first); // first sum for "Group Four" 
console.log(o["Group Four"].second); // second sum for "Group Four" 

console.log(o); // all groups with their sums