奇怪的LoDash行为

时间:2014-09-28 08:05:48

标签: javascript lodash

使用此代码:

var objects = [{'a': 1}, {'b': 2}];
var result1, result2;  

result1 = _(objects)
  .filter(_.partialRight(_.has, 'a'))
  .value();

result2 = _(objects)
  .filter(function(o){ return _.partialRight(_.has, 'a')(o);})
  .value();

result1将是一个空数组,result2将为[{'a': 1}]。 为什么呢?

PS
Plunker:
http://plnkr.co/edit/6nhLBtq2id0GSYXVjhcX?p=preview

2 个答案:

答案 0 :(得分:3)

正在发生的事情是filter需要更多的参数,这些参数在组合中被隐式应用,但在应用程序中却没有:

// what it looks like
.filter(_.partialRight(_.has, 'a'))

// what's happening
.filter(function(o,i,xs){return _.partialRight(_.has,'a')(o,i,xs);})

请参阅此处http://plnkr.co/edit/Q2Gz5vllUufzRvUuhqDQ?p=preview

答案 1 :(得分:1)

这个答案是@elclanrs'的补充。 one

如果不创建匿名函数,你可以做你想做的事情:

result1 = _(objects)
  .filter(_.compose(_.partialRight(_.has, 'a'), _.identity))
  .value();

说明:

_.compose()函数接受函数引用的数量并将它们相互应用,将执行结果从前一个函数传递给下一个函数。 _.identity()函数返回第一个传递的参数。

因此,如果我们展开_.compose(_.partialRight(_.has, 'a'), _.identity)表达式,它将如下所示:

function (a, b, c) {
    return _.partialRight(_.has, 'a')(_.identity(a, b, c));
}

在线演示:http://plnkr.co/edit/kU3MkrfSJol9c9JbGBqo?p=preview

参考文献: