计算可以为 null 或 undefined 的数组元素的总和
Compute the sum of elements of an array which can be null or undefined
我有以下数组:
myData = [[2, null, null, 12, 2],
[0, 0, 10, 1, null],
undefined];
我想计算每个子数组的总和,所以在我的例子中,结果应该是这种形式的数组:result = [16, 11, 0]
。这意味着 null
和 undefined
将被零替换。
如果我没有最后一个元素,我的方法可以正常工作,undefined
:
MyCtrl.sum = MyCtrl.myData.reduce(function (r, a) {
a.forEach(function (b, i) {
r[i] = (r[i] || 0) + b;
});
return r;
}, []);
如果有 null
或 undefined
作为子数组,我尝试了一些方法将 return 归零,但我不知道如何:
MyCtrl.sum = MyCtrl.myData.reduce(function (r, a) {
if(a) {
a.forEach(function (b, i) {
r[i] = (r[i] || 0) + b;
}); } else {
r[i] = 0;
}
return r;
}, []);
它说 'i' 没有在 else 分支上定义。
你知道解决这个问题的方法吗?
您可以通过检查内部数组来映射值,如果没有给出,则将数组作为默认值。
对于添加,您可以在以零作为起始值的归约中使用零作为默认值。
var array = [[2, null, null, 12, 2], [0, 0, 10, 1, null], undefined],
result = array.map(a => (a || []).reduce((s, v) => s + (v || 0), 0));
console.log(result);
你可以试试(使用lodash):
var myData = [[2, null, null, 12, 2],
[0, 0, 10, 1, null],
undefined];
// Flatten array
var myDataMerged = _.filter([].concat.apply([], myData), (v) => {
return _.isNumber(v);
});
var sum = myDataMerged.reduce((a,b) => {
return a+b;
});
console.log(myDataMerged);
console.log(sum);
使用.map
怎么样?
var myData = [
[2,null,null,12,2],
[0,0,10,1,null],
undefined
];
var sum = myData.map(function(item,index){
if(!item)return 0;
if(item.length <2)return item[0];
return item.reduce(function(i1,i2){return i1+i2});
});;
console.log(sum);//[ 16, 11, 0 ]
我有以下数组:
myData = [[2, null, null, 12, 2],
[0, 0, 10, 1, null],
undefined];
我想计算每个子数组的总和,所以在我的例子中,结果应该是这种形式的数组:result = [16, 11, 0]
。这意味着 null
和 undefined
将被零替换。
如果我没有最后一个元素,我的方法可以正常工作,undefined
:
MyCtrl.sum = MyCtrl.myData.reduce(function (r, a) {
a.forEach(function (b, i) {
r[i] = (r[i] || 0) + b;
});
return r;
}, []);
如果有 null
或 undefined
作为子数组,我尝试了一些方法将 return 归零,但我不知道如何:
MyCtrl.sum = MyCtrl.myData.reduce(function (r, a) {
if(a) {
a.forEach(function (b, i) {
r[i] = (r[i] || 0) + b;
}); } else {
r[i] = 0;
}
return r;
}, []);
它说 'i' 没有在 else 分支上定义。
你知道解决这个问题的方法吗?
您可以通过检查内部数组来映射值,如果没有给出,则将数组作为默认值。
对于添加,您可以在以零作为起始值的归约中使用零作为默认值。
var array = [[2, null, null, 12, 2], [0, 0, 10, 1, null], undefined],
result = array.map(a => (a || []).reduce((s, v) => s + (v || 0), 0));
console.log(result);
你可以试试(使用lodash):
var myData = [[2, null, null, 12, 2],
[0, 0, 10, 1, null],
undefined];
// Flatten array
var myDataMerged = _.filter([].concat.apply([], myData), (v) => {
return _.isNumber(v);
});
var sum = myDataMerged.reduce((a,b) => {
return a+b;
});
console.log(myDataMerged);
console.log(sum);
使用.map
怎么样?
var myData = [
[2,null,null,12,2],
[0,0,10,1,null],
undefined
];
var sum = myData.map(function(item,index){
if(!item)return 0;
if(item.length <2)return item[0];
return item.reduce(function(i1,i2){return i1+i2});
});;
console.log(sum);//[ 16, 11, 0 ]