3
var a = [ [1,2,3], [4,5,6], [7,8,9] ];
_.map( a, _.max );
// gives [3, -Infinity, -Infinity]

我已经在我的 Chrome 浏览器上测试了它,在 lodash 网站上。

上面的代码不应该返回 [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)); } );
4

1 回答 1

5

总体结论

我在 GitHub 上打开了一个问题:https ://github.com/lodash/lodash/issues/379
感谢jdalton,该问题现已解决。示例:→ jsFiddle

详细信息(为什么结果“奇怪”?)

我从未详细地与 Lodash 合作过,但这里是我的研究:

检索集合的最大值。如果集合为空或-Infinity返回 false。
Lodash 文档:_.max()

_.max()每个小组的测试都非常有效:

_.max([1,2,3]);  // 3
_.max([4,5,6]);  // 6
_.max([7,8,9]);  // 9

现在,我尝试_.max()在以下回调函数中手动调用_.map()

var a = [ [1,2,3], [4,5,6], [7,8,9] ];
alert(_.map( a, function(val) {
    return _.max(val);
}));

工作正常!_.max()那么这和作为第二个参数 提供的区别在哪里呢?
_.map()实际上向回调函数发送了 3 个参数:

(值,索引|键,集合)。
Lodash 文档:_.map()

考虑_.max()now 的第二个参数:

2.[callback=identity] (Function|Object|string):每次迭代调用的函数。如果提供了属性名称或对象,它将分别用于创建“.pluck”或“.where”样式的回调。
Lodash 文档:_.max()

结论: _.max() gets 也传递了 . 提供的第二个和第三个参数_.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

这来自源代码中执行的布尔检查: https ://github.com/lodash/lodash/blob/f0f7eee963966516490eb11232c9e9b4c6d0cc6c/dist/lodash.js#L3431

因为callback(第二个参数)是真值,我们直接跳转到else分支。在那里,callback重新分配如下(三元运算也将采用else分支):

lodash.createCallback(callback, thisArg, 3);

createCallback()在这里定义。它为我们的特定输入参数返回以下函数(这些是1, null, 3,请参阅_.max()详细信息):

return function(object) {
  return object[func];
};

假设我们将其保存在一个名为callback( → jsFiddle ) 的变量中:

var callback = _.createCallback(1, null, 3);

object = 1使用(或 2、3 或 6 等)调用该函数会导致undefined(这很明显)。

回到_.max(),我们看到有一个循环将当前值(来自回调函数)与初始/最后一个值进行比较,这是-Infinity在函数开头设置的。

undefined > -Infinity永远不会导致true,因此-Infinity将保持“最大值”。

于 2013-10-29T11:16:38.233 回答