Lo-Dash - 帮助我理解为什么_.pick不能像我期望的那样工作

时间:2014-09-10 15:16:54

标签: javascript lodash

这有效:

MyCollection.prototype.select = function (properties) {
   var self = this;

   return {
      where: function (conditions) {
         return _.chain(self.arrayOfObjects)
           .where(conditions)
           .map(function (result) {
              return _.pick(result, properties);
           })
           .value();
      }
   };
};

它允许我像这样查询我的收藏:

var people = collection
             .select(['id', 'firstName'])
             .where({lastName: 'Mars', city: 'Chicago'});

我希望能够编写这样的代码,但是:

MyCollection.prototype.select = function (properties) {
   var self = this;

   return {
      where: function (conditions) {
         return _.chain(self.arrayOfObjects)
           .where(conditions)
           .pick(properties);
           .value();
      }
   };
};

Lo-Dash文档将_.pick回调指定为“[callback](函数| ...字符串|字符串[]):每次迭代调用的函数或要选择的属性名称,指定为单个属性名称或数组财产名称。“这让我相信我可以提供属性数组,该数组将应用于符合条件的arrayOfObjects中的每个项目。我错过了什么?

2 个答案:

答案 0 :(得分:5)

http://lodash.com/docs#pick

它希望Object作为第一个参数,你给它一个Array

Arguments

1. object (Object): The source object.
2. ...
3. ...

我认为这是你能做的最好的事情:

MyCollection.prototype.select = function (properties) {
   var self = this;

   return {
      where: function (conditions) {
         return _.chain(self.arrayOfObjects)
           .where(conditions)
           .map(_.partialRight(_.pick, properties))
           .value();
      }
   };
};

答案 1 :(得分:2)

它不起作用,因为_.pick需要一个对象,而不是从链中的where函数传递的集合。