2014-10-01 39 views
6

我需要在哪裏但與不是的情況。例如,我想找到的戲劇,它沒有名字「莎士比亞」:如何讓`哪裏不是`情況?

_.where(listOfPlays, {author: !"Shakespeare", year: 1611}); 
           ^^^^^^^^^^^^^ 
          NOT Shakespeare 

如何與underscore辦呢?

回答

8
_.filter(listOfPlays, function(play) { 
    return play.author !== 'Shakespeare' && play.year === 1611; 
}); 

http://underscorejs.org/#filter

where無非是一個方便的包裝圍繞filter

// Convenience version of a common use case of `filter`: selecting only objects 
// containing specific `key:value` pairs. 
_.where = function(obj, attrs) { 
    return _.filter(obj, _.matches(attrs)); 
}; 

https://github.com/jashkenas/underscore/blob/a6c404170d37aae4f499efb185d610e098d92e47/underscore.js#L249

+1

我認爲,'_.not()'包裝也是有用的。例如,'_.not(listOfPlays,{author:「Shakespeare」})'。 – Warlock 2014-10-01 15:05:10

0

試試這個:

_.filter(listOfPlays,function(i){ 
    return i['author']!='Shakespeare' && i['year']==1611; 
}); 
7

你可以自己做飯的「不到哪」的_.where版本這樣

_.mixin({ 
    "notWhere": function(obj, attrs) { 
     return _.filter(obj, _.negate(_.matches(attrs))); 
    } 
}); 

然後你就可以寫你這樣的代碼

_.chain(listOfPlays) 
    .where({ 
     year: 1611 
    }) 
    .notWhere({ 
     author: 'Shakespeare' 
    }) 
    .value(); 

注:_.negate只能從V1。 7.0。所以,如果您使用的是_以前的版本,你可能想要做這樣的事情

_.mixin({ 
    "notWhere": function(obj, attrs) { 
     var matcherFunction = _.matches(attrs); 
     return _.filter(obj, function(currentObject) { 
      return !matcherFunction(currentObject); 
     }); 
    } 
}); 
+0

是的,它會很酷!謝謝!有一句話,最好把函數命名爲not()。 – Warlock 2014-10-01 15:11:30

+0

@Warlock我們已經有了一個名爲['_.negate'](http://underscorejs.org/#negate)的函數,所以'not'和'negate'可能會讓人困惑...... – thefourtheye 2014-10-01 15:12:17

+0

好的,我明白了。謝謝! – Warlock 2014-10-01 15:12:55

0

正確答案充沛,但技術上的OP只是問否定。您也可以使用拒絕,它本質上與過濾器相反。要達到1611的複合條件而不是莎士比亞:

_.reject(_.filter(listOfPlays, function(play){ 
    return play.year === 1611 
}), function(play) { 
    return play.author === 'Shakespeare'; 
}); 
相關問題