2017-02-15 45 views
1

我正在使用lodash方法_.some用'_.some'調用每個項目的函數的速記

對於謂詞,我只是調用當前項的方法並返回值。

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

這個按預期工作!

但是,我想知道是否有執行此操作的簡寫方式?

如果hasChanges是一個屬性,我可以這樣做:

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

我試圖通過調用方法:

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

但它似乎並沒有像預期的那樣工作。

回答

1

如果您確實想要採用Lodash方式,則可以使用_.partial_.result_.invoke構建自定義謂詞的等效項。使用Array的some功能和箭頭功能

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:

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

謂詞可以一次創建,以後使用。

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

_.some(或最some功能實現)打破在第一truthy發生循環。像_.invokeMap這樣的函數將調用每個對象的函數,而不管結果哪個效率比我們已經擁有的自定義謂詞效率低

​​,但它們不調用對象上的函數。

// 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()

+1

偉大的信息! ES6語法看起來確實是最簡潔的方法。 感謝您澄清爲什麼簡單的_.invoke不起作用,以及提醒我__identity和佔位符_是完全不同的! – user715374