JavaScript Map Reduce:奇怪的行为
我不明白为什么第二种形式不起作用。欢迎任何解释 编辑:技术背景:Chrome和Firefox JavaScript引擎。请参见ES5 REDUCT接受多个参数。这与不适用于JavaScript Map Reduce:奇怪的行为,javascript,mapreduce,Javascript,Mapreduce,我不明白为什么第二种形式不起作用。欢迎任何解释 编辑:技术背景:Chrome和Firefox JavaScript引擎。请参见ES5 REDUCT接受多个参数。这与不适用于parseInt或其他类似函数的原因完全相同。您需要自己绑定参数 reduce将index和array等值馈送到Math.min 如果我们遵循以下步骤,我们可以确认这一点: 首先,我们代理Math.min: var t = [-12, 57, 22, 12, -120, -3]; t.map(Math.abs).reduce
parseInt
或其他类似函数的原因完全相同。您需要自己绑定参数
reduce将index
和array
等值馈送到Math.min
如果我们遵循以下步骤,我们可以确认这一点:
首先,我们代理Math.min:
var t = [-12, 57, 22, 12, -120, -3];
t.map(Math.abs).reduce(function(current, previousResult) {
return Math.min(current, previousResult);
}); // returns 3
t.map(Math.abs).reduce(Math.min); // returns NaN
然后我们运行第二个版本:
var oldMath = Math.min;
Math.min = function (){
console.log(arguments)
return oldMath.apply(Math, arguments);
}
哪些日志:
[-12, 57, 22, 12, -120, -3].reduce(Math.min);
由于数组[6]不是数字,因此结果为NaN
以下是来自MDN的一个非常类似的示例:
[-12, 57, 1, Array[6]]
而人们可以预期[1,2,3]
实际结果是[1,NaN,NaN]
parseInt
通常与一个参数一起使用,但需要两个参数。第二个是基数
Array.prototype.map向回调函数传递3个参数:元素、索引和数组
parseInt忽略第三个参数,但不忽略第二个参数,因此可能会产生混淆。的回调调用传递四个参数:previousValue
、currentValue
、index
和数组
。因为是一个函数,所以您的代码:
["1", "2", "3"].map(parseInt);
相当于:
t.map(Math.abs).reduce(Math.min); // returns NaN
这就是为什么结果是NaN
:最后一个参数array
,不是一个数字
您也可以使用类似的解决方案来解决此类问题:
t.map(Math.abs).reduce(function(current, previousResult, index, array) {
return Math.min(current, previousResult, index, array);
});
然后:
function binary (fn) {
return function (a, b) {
return fn.call(this, a, b);
}
}
将起作用。这是“在浏览器中”,我更新了我的答案。@AsTeR:具体来说,是的,它还没有广泛实施。
t.map(Math.abs).reduce(binary(Math.min));