差异 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));
returns 6.However 上方的控制台,从数组中,值得注意的是 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));
returns object {start: 3, value: 1}
这是完全正确的。因此
console.log('The min value ', arr.reduce(getMinValue).start);
是正确的。为什么第一个不同 pls ?为什么 return 6 ? .我对 reduce 或我的 getMin 函数有什么误解吗?任何帮助将不胜感激。
Why does it return 6 ?
因为 a
是一个 accumulator
,它也恰好是每次迭代的 return 值 .
这一行
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).value
是 undefined
并且与 undefined
的比较总是 returns false
.
最后一次迭代将是
(14).value < { start: 6, value: 3 }
return 6
.
因为无论您从传递给 reduce 的函数中 return 成为 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
一样。
那你return一个号。
第二次,accumulator
现在是您 return 编辑的数字。
一般来说,你还应该使用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() 方法return从所有通过对原始数组执行的特定测试的元素创建的新数组。
var landSum = data.reduce(function(sum, d) {
return sum + d.land_area;
}, 0);
console.log(landSum);
要减少的第一个参数是将 return 运行 "total" 减少的回调函数。此函数是在上次调用回调时的前一个值 returned 中传递的。在这里,当我们在数组中移动时,该参数 - sum 提供 运行 总数。回调 d 的第二个参数是我们正在处理的数组的当前值。
reduce 可以有一个初始值,这是 reduce 调用的第二个参数。对于这个例子,我们从 0 开始求和。如果没有提供起始值,那么对于回调的第一次执行(当没有先前的值时)回调的第一个参数将是第一个元素的值数组,缩减从第二个元素开始。
因此,在您的情况下,您将变量作为 return 传递给 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));
returns 6.However 上方的控制台,从数组中,值得注意的是 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));
returns object {start: 3, value: 1}
这是完全正确的。因此
console.log('The min value ', arr.reduce(getMinValue).start);
是正确的。为什么第一个不同 pls ?为什么 return 6 ? .我对 reduce 或我的 getMin 函数有什么误解吗?任何帮助将不胜感激。
Why does it return 6 ?
因为 a
是一个 accumulator
,它也恰好是每次迭代的 return 值 .
这一行
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).value
是 undefined
并且与 undefined
的比较总是 returns false
.
最后一次迭代将是
(14).value < { start: 6, value: 3 }
return 6
.
因为无论您从传递给 reduce 的函数中 return 成为 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
一样。
那你return一个号。
第二次,accumulator
现在是您 return 编辑的数字。
一般来说,你还应该使用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() 方法return从所有通过对原始数组执行的特定测试的元素创建的新数组。
var landSum = data.reduce(function(sum, d) {
return sum + d.land_area;
}, 0);
console.log(landSum);
要减少的第一个参数是将 return 运行 "total" 减少的回调函数。此函数是在上次调用回调时的前一个值 returned 中传递的。在这里,当我们在数组中移动时,该参数 - sum 提供 运行 总数。回调 d 的第二个参数是我们正在处理的数组的当前值。
reduce 可以有一个初始值,这是 reduce 调用的第二个参数。对于这个例子,我们从 0 开始求和。如果没有提供起始值,那么对于回调的第一次执行(当没有先前的值时)回调的第一个参数将是第一个元素的值数组,缩减从第二个元素开始。
因此,在您的情况下,您将变量作为 return 传递给 reduce,这就是获得上述结果的原因