我试图讨论一个lodash函数,并且我得到了一些奇怪的行为。基本上是:
function(item){return _.curryRight(myFunction)('const')(item)}
与
不同_.curryRight(myFunction)('const')
我的猜测是问题出现了,因为lodash中的函数是否有不同的arity,无论你想链接它们。
我观察到maxBy的行为
var myArrays = [[{variable : 1}, {variable : 2}], [{variable : 3}, {variable : 2}]];
返回预期结果
_.map(myArrays, function(item){return _.maxBy(item, 'variable')})
> [ { variable: 2 }, { variable: 3 } ]
如果我们在函数
中讨论maxBy,我们会得到相同的行为_.map(myArrays, function(item){return _.curryRight(_maxBy)('variable')(item)})
> [ { variable: 2 }, { variable: 3 } ]
但是,以下操作不起作用
_.map(myArrays, _.curryRight(_.maxBy)('variable'))
>[undefined, undefined]
基本上问题是,为什么最后一个方法与前两个方法的返回方式不一样?
答案 0 :(得分:0)
_.map(myArrays, _.curryRight(_.maxBy)('variable'))
这种情况不起作用,因为_.maxBy的第二个参数 - 必须是字符串'variable'。您可以在开发人员工具中找到lodash源代码并找到方法_.maxBy。在此源文件中写入“console.log”并保存(Ctrl + s)。
function maxBy(array, iteratee) {
console.log(arguments);
return (array && array.length)
? baseExtremum(array, getIteratee(iteratee), gt)
: undefined;
}
在控制台中运行
_.map(myArrays, _.curryRight(_.maxBy)('variable'))
你看:
[Array[2], 1, Array[2], "variable"]
方法_.maxBy首先传递_.map iteratee函数https://lodash.com/docs#map的所有参数,然后传递该字符串'variable'。
使用:
_.map(myArrays, _.flow(_.identity, _.curryRight(_.maxBy)('variable')));
它正常工作。 抱歉我的英语不好。
答案 1 :(得分:0)
为了使 curryRight
起作用,'variable'
必须是第二个参数。
但是,当使用 _.map
函数时,'variable'
作为第四个参数出现。
这与执行 _.map(array, parseInt)
时发生的错误基本相同,结果将出乎意料,因为 parseInt
将接收索引作为第二个参数并将其用作基数