如果数组中只有一个对象,则Lodash返回错误的reduce结果

Lodash returns wrong reduce result if there is only one object in the array

本文关键字:返回 Lodash 错误 结果 reduce 数组 一个对象 如果      更新时间:2023-10-07

我得到一个对象数组,其中包含一些需要求和的值。有时数组中只有一个项。在这种情况下,我得到了一个错误的值。

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}

这是小提琴

如何使其返回分别为3和1的正确结果?

首选解决方案:您可以将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}}]

或者做地图缩小:

_(array).pluck('value').reduce(function(sum, n) { return sum + n; })

或者为什么不先检查一下数组的大小?

if (array.length === 1) { return array[0].value; } else { ...reduce... }

设置初始累加器_.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>