array.reduce javascript中的差异

时间:2018-01-30 05:54:14

标签: javascript arrays reduce

我花了好几个小时尝试调试特定的代码,最后我注意到了一些我不理解arr reduce函数的东西。以下面的代码示例

var arr = [{
  start: 1,
  value: 4
}, {
  start: 2,
  value: 5
}, {
  start: 3,
  value: 1
}, {
  start: 4,
  value: 41
}, {
  start: 5,
  value: 14
}, {
  start: 6,
  value: 3
}];

const getMinValue = function(a, b) {
  return (a.value < b.value) ? a.start : b.start;
}

console.log('The min value ', arr.reduce(getMinValue));

上面的控制台返回6.但是,从数组中可以看出,该值在start:3处最小。但是,将代码重写到下面,

var arr = [{
  start: 1,
  value: 4
}, {
  start: 2,
  value: 5
}, {
  start: 3,
  value: 1
}, {
  start: 4,
  value: 41
}, {
  start: 5,
  value: 14
}, {
  start: 6,
  value: 3
}];

const getMinValue = function(a, b) {
  return (a.value < b.value) ? a : b;
}

console.log('The min value ', arr.reduce(getMinValue));

返回完全正确的对象{start: 3, value: 1}。因此

console.log('The min value ', arr.reduce(getMinValue).start);

是对的。为什么第一个不同?为什么它会返回6? 。有什么我错误的减少或我的getMin功能?任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

  

为什么它会返回6?

因为aaccumulator,它恰好也是每次迭代的返回值

这一行

return (a.value < b.value) ? a.start : b.start;

将条件表达式转换为

{start: 1, value : 4}.value < { start: 2, value: 5}.value

下次再开始

(4).value < { start: 3,  value: 1 } //false hence return 1

由于(4).valueundefined,与undefined的比较始终会返回false

最后一次迭代

(14).value < { start: 6,  value: 3 } 

返回6

答案 1 :(得分:2)

因为从函数返回的任何内容都会转换为reduce a

const someReducer = (accumulator, x) => {
  // whatever I return here is the new value of the accumulator
  return accumulator.value < x.value ? accumulator.start : x.start;
}

someArray.reduce(someReducer);

第一次accumulator的值是value之类的对象。 然后你返回一个数字。 第二次,accumulator现在是您返回的数字。

通常,您还应该使用reduce的第二个参数,它是reducer的初始值。如果您的理想accumulator类型与数组中的值类型不同,则这非常重要。

如果你有一个稍微简单的版本,你可以考虑:

values.reduce(getMinValue, Infinity);

如果更改为

,您的初始功能将正常工作
const getMinValue = (accumulator, x) =>
  accumulator < x.value ? accumulator : x.value;

在此示例中,累加器始终是数字,x是您的对象之一。这不是你在原始问题中所要求的,但是

.reduce(getMinValue, { start: 0, value: Infinity })

也可以。

答案 2 :(得分:0)

filter()方法返回一个新数组,该数组是从通过在原始数组上执行的某个测试的所有元素创建的。

var landSum = data.reduce(function(sum, d) {
  return sum + d.land_area;
}, 0);
console.log(landSum);

要减少的第一个参数是回调函数,它将返回减少的运行“总计”。此函数在上次调用回调时返回的前一个值中传递。这里,该参数 - sum提供了我们在数组中移动时的运行总计。回调d的第二个参数是我们正在处理的数组的当前值。

reduce可以取一个初始值,这是reduce调用的第二个参数。对于这个例子,我们在0处开始求和。如果没有提供起始值,那么对于第一次执行回调(当没有前一个值时),回调的第一个参数将是第一个元素的值。数组,减少从第二个元素开始。

因此,在您的情况下,您将传递变量作为返回到reduce,这就是获得上述结果的原因