2014-10-01 21 views
6

Ich brauche wo aber mit nicht Fall. Zum Beispiel würde Ich mag Spiele finden, die keinen Namen „Shakespeare“ haben:Wie macht man `wo nicht`?

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

Wie kann ich es tun mit underscore?

Antwort

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

http://underscorejs.org/#filter

where ist nichts anderes als eine bequeme Wrapper um 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

Ich denke, es wäre nützlich, '_.not()' Wrapper als auch zu haben. Zum Beispiel '_.not (listOfPlays, {author:" Shakespeare "})'. – Warlock

0

Versuchen Sie folgendes:

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

Sie können Ihre eigenen Koch „nicht, wo“ -Version von _.where wie diese

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

Und dann können Sie Ihren Code wie dieser

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

Hinweis schreiben:_.negate nur von v1 zur Verfügung steht. 7.0. Also, wenn Sie frühere Version von _ verwenden, möchten Sie vielleicht so etwas wie dieses

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

ja, es wäre cool! Vielen Dank! Eine Anmerkung, es wäre besser, die Funktion als 'not()' zu bezeichnen. – Warlock

+0

@Warlock wir haben bereits eine Funktion namens ['_.negate'] (http://underscorejs.org/#negate), also' not' und 'negate' könnte verwirrend sein ... – thefourtheye

+0

Ok, ich verstehe. Vielen Dank! – Warlock

0

Viel richtigen Antworten tun, aber technisch die OP nur gefragt, negiert. Sie können auch Ablehnen verwenden, es ist im Wesentlichen das Gegenteil von Filter. Um den zusammengesetzten Zustand von 1611 und nicht Shakespeare zu erreichen:

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