我得到一个具有一些值的对象数组,我需要求和。有时阵列中只有一个项目。 在那种情况下,我得到了错误的价值。
var sumGood = _.reduce([{value:1},{value:2}], function(sum, n) {
return sum.value + n.value; });
console.log(sumGood)
// 3
var sumBad = _.reduce([{value:1}], function(sum, n) {
return sum.value + n.value; });
console.log(sumBad)
// Object {value: 1}
以下是fiddle
如何让它返回分别为3和1的正确结果?
答案 0 :(得分:2)
优先解决方案:您可以将reduce的第三个参数设置为初始迭代,此处为{value:0}。如果没有这个,如果你只有一个项目,lodash就无法知道之前sum
是什么。
_.reduce(array, function(sum, n) {
return sum.value + n.value;
}, {value:0});
或者,您可以在reduce:
之前向数组添加0值array.unshift( {value: 0} ) // now array is [{value:0}, {value:1}}]
或者做map-reduce:
_(array).pluck('value').reduce(function(sum, n) { return sum + n; })
或者为什么不在之前检查阵列的大小?
if (array.length === 1) { return array[0].value; } else { ...reduce... }
答案 1 :(得分:0)
设置初始累加器_.reduce(collection, [iteratee=_.identity], [accumulator], [thisArg])
var sum3 = _.reduce([{
value: 1
}, {
value: 2
}, {
value: 3
}],
function(memo, num) {
return memo + num.value;
},
0
);
console.log(sum3);
var sum1 = _.reduce([{
value: 1
}],
function(memo, num) {
return memo + num.value;
},
0
);
console.log(sum1);
var otherWay = _.reduce([{
value: 1
}, {
value: 2
}, {
value: 3
}], function(memo, num) {
memo.value = memo.value + num.value;
return memo;
}, {
value: 0
}).value;
console.log(otherWay)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.7.0/underscore-min.js"></script>