var a = [ [1,2,3], [4,5,6], [7,8,9] ];
_.map( a, _.max );
// gives [3, -Infinity, -Infinity]
Run Code Online (Sandbox Code Playgroud)
我已经在lodash网站上的Chrome浏览器上对其进行了测试.
上面的代码不应该返回[3,6,9]吗?
我可以用forEach获得正确的结果:
var a = [ [1,2,3], [4,5,6], [7,8,9] ];
var result = [];
_.forEach( a, function(arr) { result.push(_.max(arr)); } );
Run Code Online (Sandbox Code Playgroud)
我在GitHub上打开了一个问题:https
://github.com/lodash/lodash/issues/379
感谢jdalton,问题现已解决.示例:→ jsFiddle
我从未详细介绍过Lodash,但这里是我的研究:
检索集合的最大值.如果集合为空或
-Infinity返回falsey .
- Lodash文档:_.max()
_.max()每组的测试都非常完美:
_.max([1,2,3]); // 3
_.max([4,5,6]); // 6
_.max([7,8,9]); // 9
Run Code Online (Sandbox Code Playgroud)
现在,我尝试_.max()在回调函数中手动调用_.map():
var a = [ [1,2,3], [4,5,6], [7,8,9] ];
alert(_.map( a, function(val) {
return _.max(val);
}));
Run Code Online (Sandbox Code Playgroud)
工作良好!那么它和_.max()第二个参数之间的区别在哪里呢?
_.map()实际上向回调函数发送3个参数:
(值,索引|键,集合).
- Lodash文档:_. map()
考虑一下_.max()现在的第二个参数:
2. [callback = identity](Function | Object | string):每次迭代调用的函数.如果提供属性名称或对象,它将分别用于创建".pluck"或".where"样式回调.
- Lodash文档:_.max()
结论: _.max()获取也传递了第二个和第三个参数_.map().第二个参数在这里很重要!为它传递真值(例如整数!= 0)让函数返回-Infinity.
测试用例(→jsFiddle):
alert(_.max([1,2,3], 0)); // 3
alert(_.max([1,2,3], 1)); // -Infinity
alert(_.max([1,2,3], 2)); // -Infinity
Run Code Online (Sandbox Code Playgroud)
这来自源代码中执行的布尔检查:https: //github.com/lodash/lodash/blob/f0f7eee963966516490eb11232c9e9b4c6d0cc6c/dist/lodash.js#L3431
因为callback(第二个参数)是一个真值,我们将直接跳转到else分支.在那里,callback重新分配如下(三元操作也将采用else分支):
lodash.createCallback(callback, thisArg, 3);
Run Code Online (Sandbox Code Playgroud)
createCallback()在这里定义.它为我们的特定输入参数返回以下函数(有关详细信息1, null, 3,请参阅_.max()参考资料):
return function(object) {
return object[func];
};
Run Code Online (Sandbox Code Playgroud)
让我们说,我们将其保存在一个名为callback(→jsFiddle)的变量中:
var callback = _.createCallback(1, null, 3);
Run Code Online (Sandbox Code Playgroud)
用object = 1(或2,3或6等)调用该函数会导致undefined(这很明显).
回过头_.max()来看,我们看到有一个循环将当前值(来自回调函数)与初始/最后一个值进行比较,这是-Infinity在函数开头设置的.
undefined > -Infinity从来没有真实,所以-Infinity将保持'最大'的价值.