使用'_.some'调用每个项目上的函数的简写

时间:2017-02-15 20:11:37

标签: javascript lodash

我使用的是lodash方法 _.some

对于谓词,我只是在当前项上调用一个方法并返回值。

return _.some(items, function(item) {
    return item.hasChanges();
});

这可以按预期工作!

但是,我想知道是否有一种简便的方法来执行此操作?

如果hasChanges是属性,我可以这样做:

return _.some(items, "hasChanges");

我试图通过以下方式调用该方法:

return _.some(items, _.invoke(_.identity, "hasChanges"));

但它似乎没有按预期工作。

1 个答案:

答案 0 :(得分:1)

如果你真的想要采用Lodash方式,可以使用_.partial_.result_.invoke来构建自定义谓词的等价物。

_.some(users, _.partial(_.invoke, _, 'hasChanges'));

谓词可以创建一次并在以后使用:

var predicate = _.partial(_.invoke, _, 'hasChanges');
// later...
// a function which only checks, without creating a
// new anonymous function each time.
function check() {
    return _.some(users, predicate);
}

ES6使用Array的some函数和箭头函数。

items.some(item => item.hasChanged());

_.some(或大多数some函数实现)在第一个truthy发生时打破循环。类似_.invokeMap的函数会在每个对象上调用该函数,而不管结果哪个效果低于我们已有的自定义谓词

Lodash offers shorthand syntax for common predicates,但他们不会在对象上调用函数。

// The `_.matches` iteratee shorthand.
_.some(users, { 'user': 'barney', 'active': false });
// => false

// The `_.matchesProperty` iteratee shorthand.
_.some(users, ['active', false]);
// => true

// The `_.property` iteratee shorthand.
_.some(users, 'active');
// => true

以下工作没有成功:

_.invoke(_.identity, "hasChanges")

它类似于_.identity.hasChanges()