0

Angenommen, ich habe eine Sammlung:Filter mit 'oder' in lodash Kürzel

var collection = [{type: 'a'}, {type: 'b'}, {type: 'c'}, {type: 'd'}]

Wie kann ich es filtern, so dass nur Typen 'a' und 'b' bleiben wird? Ich würde erwarten, etwas zu tun:

_filter(collection, ['type', 'a', 'b'])

D.h. Verwenden Sie _.matchesProperty iteratee shorthand, um mehrere übereinstimmende Typen zu behandeln, aber das funktioniert nicht auf diese Weise. Kennen Sie einen einfachen Weg dies zu erreichen, ohne eine benutzerdefinierte Funktion zu definieren?

+2

Was ist so wichtig, wenn Sie keine eigene Funktion erstellen? 'collection = _.filter (Sammlung, Funktion (e) {return e.type == 'a' || e.type == 'b'});' Fertig. Noch besser mit ES2015: 'collection = _.filter (Sammlung, e => e.type == 'a' || e.type == 'b');' –

+0

Es ist kein Blocker, aber ich war meistens überrascht Dies wurde nicht unterstützt, und einige Nachforschungen durchgeführt, um nichts zu finden, wollte also bestätigen, dass dies in lodash eigentlich nicht möglich ist. Außerdem spiele ich mit mehr funktioneller Art, Sachen zu tun, also hoffte ich, dass jemand mit einer interessanten Verwendung von _property, _.partial oder etwas Ähnlichem kommen würde. Aber Sie haben vollkommen Recht, das kann leicht mit benutzerdefinierten Funktion und sogar in eleganter Weise in ES6 getan werden. – wap300

+2

Sie können in Erwägung ziehen, [conforms()] (https://lodash.com/docs#conforms) zu verwenden, wobei die 'type'-Eigenschaft [includes] (https://lodash.com/docs#includes) verwendet, das [bindet ] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind) '['a', 'b']' als ersten Parameter. – ryeballar

Antwort

1

Großartig, um Rogeballars Vorschlag zu einer Antwort zu machen:

Angenommen, ich habe ein:

var collection = [{type: 'a'}, {type: 'b'}, {type: 'c'}, {type: 'd'}]

Im Folgenden nur herausfiltert 'a' und 'b' Typen:

_.filter(collection, _.conforms({'type': _.partial(_.includes, ['a', 'b'])}))

nicht das schönste Code, aber ich denke, Beats ES5-Funktion und zeigt, wie _.conforms funktioniert. Genau das, was ich gesucht habe!

+4

*" Nicht der hübscheste Code, aber ich denke Beats ES5 Funktion ... "* Ähm ...Auge des Betrachters, schätze ich. Ich würde * lieber * einen einfachen 'Filter'-Aufruf sehen. –

+1

Nun, Sie haben wahrscheinlich recht, aber es war trotzdem ein interessantes Puzzle. :) – wap300

+0

Du sagst Dinge wie "shorthand expression" und "ES5 function" als ob diese irgendeine Bedeutung haben ... – naomik

2

Sie können die _.filter mit einer Funktion verwenden, um es funktionsfähig zu machen, sondern einfach .filter auch genügen:

ES5:

collection.filter(function (i) { 
    return i.type === 'a' || i.type === 'b'; 
}); 

ES6

collection.filter(i => i.type === 'a' || i.type === 'b') 
+0

Die Leute haben ihre Köpfe in den Arsch gedrückt und wählen diese einfache, direkte Antwort. – naomik

+0

Dank @ Naomik. Ich denke, wenn Sie Stackoverflow downvote sollte einen Grund fragen. Ich verstehe nicht, warum Leute runtermachten, ohne auch nur das Problem/die Lösung zu verstehen. –

+0

Ich habe dieses nicht abgelehnt, aber ich nehme an, dass es abgelehnt wurde, denn ich habe diese Lösung in meiner Frage ausdrücklich ausgeschlossen: "ohne eine benutzerdefinierte Funktion zu definieren " – wap300

0
collection.filter(i => ['a', 'b'].includes(i.type));