繁体   English   中英

array.reduce javascript中的差异

[英]discrepancy in array.reduce javascript

我花了几个小时尝试调试特定的代码,但最后我发现我对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? 我是否对reduce或getMin函数有误解? 任何帮助,将不胜感激。

为什么返回6?

因为a是一个accumulator ,也恰好是每次迭代的返回值

这条线

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

因为无论从函数返回的结果是什么,传递给reduce的值都会成为a的NEXT值。

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就像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 })

也可以。

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

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

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

reduce可以取一个初始值,它是reduce调用的第二个参数。 在此示例中,我们将总和从0开始。如果未提供起始值,则对于首次执行回调(如果没有先前值),则回调的第一个参数将为的第一个元素的值数组,并且减少从第二个元素开始。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM