假设我有一个数组数组,如下所示:
[
[0, 1, 3],
[2, 4, 6],
[5, 5, 7],
[10, 0, 3]
]
如何生成一个新数组,该数组在javascript中对内部数组的每个位置的所有值求和?在这种情况下,结果将是:[17,19,19]。无论内部数组的长度如何,我都需要能够提供一个有效的解决方案。我认为这可以使用map和for-of的一些组合,或者可能减少,但我不能完全围绕它。我搜索过但找不到任何与此相符的例子。
答案 0 :(得分:41)
您可以将Array.prototype.reduce()
与Array.prototype.forEach()
结合使用。
var array = [
[0, 1, 3],
[2, 4, 6],
[5, 5, 7],
[10, 0, 3]
],
result = array.reduce(function (r, a) {
a.forEach(function (b, i) {
r[i] = (r[i] || 0) + b;
});
return r;
}, []);
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
&#13;
更新,通过采用减少阵列的地图来缩短方法。
var array = [[0, 1, 3], [2, 4, 6], [5, 5, 7], [10, 0, 3]],
result = array.reduce((r, a) => a.map((b, i) => (r[i] || 0) + b), []);
console.log(result);
&#13;
答案 1 :(得分:9)
使用Lodash 4:
function sum_columns(data) {
return _.map(_.unzip(data), _.sum);
}
var result = sum_columns([
[1, 2],
[4, 8, 16],
[32]
]);
console.log(JSON.stringify(result));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
Lodash 4改变了_.unzipWith
的工作方式,现在iteratee一次获得作为扩展参数传递的所有值,所以我们不能再使用reducer样式_.add
了。使用Lodash 3,以下示例可以正常运行:
function sum_columns(data) {
return _.unzipWith(data, _.add);
}
var result = sum_columns([
[1, 2],
[4, 8, 16],
[32],
]);
console.log(JSON.stringify(result));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.js"></script>
_.unzipWith
将插入undefined
s,其中行比其他行短,_.sum
将未定义的值视为0.(自Lodash 3起)
如果您的输入数据可以包含undefined
和null
项,并且您希望将其视为0,则可以使用此项:
function sum_columns_safe(data) {
return _.map(_.unzip(data), _.sum);
}
function sum_columns(data) {
return _.unzipWith(data, _.add);
}
console.log(sum_columns_safe([[undefined]])); // [0]
console.log(sum_columns([[undefined]])); // [undefined]
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.js"></script>
这个snipet适用于Lodash 3,遗憾的是我没有找到一个很好的方法,在Lodash 4中将undefined视为0,因为现在总和被更改为_.sum([undefined]) === undefined
答案 2 :(得分:5)
ES6
中的单行,map
和reduce
var a = [ [0, 1, 3], [2, 4, 6], [5, 5, 7], [10, 0, 3] ];
var sum = a[0].map((_, i) => a.reduce((p, _, j) => p + a[j][i], 0));
document.write(sum);
答案 3 :(得分:0)
假设嵌套数组总是具有相同的长度,可以使用concat和reduce。
function totalIt (arr) {
var lng = arr[0].length;
return [].concat.apply([],arr) //flatten the array
.reduce( function(arr, val, ind){ //loop over and create a new array
var i = ind%lng; //get the column
arr[i] = (arr[i] || 0) + val; //update total for column
return arr; //return the updated array
}, []); //the new array used by reduce
}
var arr = [
[0, 1, 3],
[2, 4, 6],
[5, 5, 7],
[10, 0, 3]
];
console.log(totalIt(arr)); //[17, 10, 19]
&#13;
答案 4 :(得分:0)
假设数组是静态的,如op showned。
View#getContext()
答案 5 :(得分:-1)
POKE