Javascript lodash中map和max的怪异行为

Javascript lodash中map和max的怪异行为,javascript,lodash,Javascript,Lodash,我已经在我的Chrome浏览器lodash网站上进行了测试 上面的代码不应该返回[3,6,9]吗 我可以使用forEach获得正确的结果: var a = [ [1,2,3], [4,5,6], [7,8,9] ]; _.map( a, _.max ); // gives [3, -Infinity, -Infinity] 总体结论 我在GitHub上发布了一个问题: 多亏了,问题现已解决。示例:→ 详细信息(为什么结果“奇怪”?) 我从未详细研究过Lodash,但以下是我的研究: 检索集

我已经在我的Chrome浏览器lodash网站上进行了测试

上面的代码不应该返回[3,6,9]吗

我可以使用forEach获得正确的结果:

var a = [ [1,2,3], [4,5,6], [7,8,9] ];
_.map( a, _.max );
// gives [3, -Infinity, -Infinity]
总体结论 我在GitHub上发布了一个问题:
多亏了,问题现已解决。示例:→

详细信息(为什么结果“奇怪”?) 我从未详细研究过Lodash,但以下是我的研究:

检索集合的最大值。如果集合为空或为假,则返回无穷大。
-

对每组进行测试
\uuu.max()
,效果非常好:

var a = [ [1,2,3], [4,5,6], [7,8,9] ];
var result = [];
_.forEach( a, function(arr) { result.push(_.max(arr)); } );
现在,我尝试在
..map()
的回调函数中手动调用
..max()

很好!那么,这与作为第二个参数提供的
\uuu.max()
之间的区别在哪里呢?
\uuz.map()
实际上向回调函数发送了3个参数:

(值、索引、键、集合)。
-

现在考虑一下
\uu0.max()
的第二个参数:

2.[callback=identity](函数|对象|字符串):每次迭代调用的函数。如果提供了属性名称或对象,则 用于分别创建“.pull”或“.where”样式回调。
-

结论:
.max()
还传递了由
\u.map()
提供的第二个和第三个参数。第二个参数在这里很重要!传递truthy值(例如整数!=0)让函数返回
-无穷

测试用例():

这来自在源代码中执行的布尔检查:

因为
callback
(第二个参数)是一个truthy值,所以我们将直接跳转到else分支。在那里,
callback
被重新分配为以下内容(三元操作也将采用else分支):

已定义
createCallback()
。 它为我们的特定输入参数返回以下函数(这些参数是
1,null,3
,有关详细信息,请参见
\uuu0.max()
):

比方说,我们将其保存在一个名为
callback
()的变量中:

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

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


未定义>-无限
永远不会为真,因此
-无限
将保留“最大”值。

非常感谢您的解释!我不确定这是一个bug还是一个特性,所以在我在lodash github上提出这个问题之前,我想先确认一下。@TPJ不客气。昨天jdalton修复了这个bug:
_.max([1,2,3]);  // 3
_.max([4,5,6]);  // 6
_.max([7,8,9]);  // 9
var a = [ [1,2,3], [4,5,6], [7,8,9] ];
alert(_.map( a, function(val) {
    return _.max(val);
}));
alert(_.max([1,2,3], 0)); // 3
alert(_.max([1,2,3], 1)); // -Infinity
alert(_.max([1,2,3], 2)); // -Infinity
lodash.createCallback(callback, thisArg, 3);
return function(object) {
  return object[func];
};
var callback = _.createCallback(1, null, 3);