2015-03-30 7 views
5

Dies ist wahrscheinlich eine einfache Frage, aber ich konnte keine Antwort aus den APIs von lodash und Google finden.lodash/unterstrich überprüfen, ob ein Objekt alle Schlüssel/Werte von einem anderen Objekt enthält

Nehmen wir an, ich habe ein Objekt wie folgt aus:

var obj = { 
    code: 2, 
    persistence: true 
} 

Ich möchte eine Funktion, die ich einen Schlüssel/Wert-Paar passieren kann und gibt true zurück, wenn der Schlüssel in meinem Objekt existiert und hat den angegebenen Wert:

_.XXXX(obj, {code: 2}); //true 
_.XXXX(obj, {code: 3}); //false 
_.XXXX(obj, {code: 2, persistence: false}); //false 
_.XXXX(obj, {code: 2, persistence: true}); //true 

Das ist irgendwie wie where() aber für nur ein Objekt.

Antwort

6

könnten Sie einen matcher verwenden:

var result1 = _.matcher({ code: 2 })(obj); // returns true 
var result2 = _.matcher({ code: 3 })(obj); // returns false 

mit einem mixin:

_.mixin({ keyvaluematch: function(obj, test){ 
    return _.matcher(test)(obj); 
}}); 

var result1 = _.keyvaluematch(obj, { code: 2 }); // returns true 
var result2 = _.keyvaluematch(obj, { code: 3 }); // returns false 

bearbeiten

Version 1.8 von Strich hinzugefügt, um eine _.isMatch Funktion.

+0

Es ist wichtig zu beachten, dass [entsprechend] (https://lodash.com/docs/4.17.0#isMatch) zu '_.isMatch', leeres Array/obj. Der Wert ist gleich _any und every_ array/obj. Wert. Das könnte oder könnte nicht das sein, was du willst.Wenn Sie einen strengeren (und tieferen) Vergleich benötigen, lesen Sie [postthtml-ast-compare] (https://www.npmjs.com/package/posthtml-ast-compare). – revelt

2

Ich glaube nicht, dass es für das eine einzige Strich Funktion ist, aber man kann man sich leicht schreiben:

function sameObject(ob1, ob2) { 
    for (var key in ob2) { 
     if (ob2[key] != ob1[key]) { 
      return false; 
     } 
    } 
    return true; 
} 
+1

mit 'for..in' Schleife ist nicht die beste. Momentan verwende ich diese Funktion: 'function containsAll (obj1, obj2) { Rückgabe _.all (_. Schlüssel (obj2), Funktion (Schlüssel) { Rückgabe obj1 [Schlüssel] === obj2 [Schlüssel]; }); } ' – AlexStack

5

https://lodash.com/docs#has

var obj = { 
    code: 2, 
    persistence: true 
}; 

console.log(_.has(obj, 'code')); 

Mein schlecht für zunächst Ihre Anforderung Missverständnis.

Hier ist die korrigierte Antwort mit _.somehttps://lodash.com/docs#some

var obj = { 
    code: 2, 
    persistence: true 
}; 

console.log(_.some([obj], {code: 2})); 
console.log(_.some([obj], {code: 3})); 
console.log(_.some([obj], {code: 2, persistence: false})); 
console.log(_.some([obj], {code: 2, persistence: true})); 

Der Trick ist, das Objekt, das Sie als Array überprüfen möchten zu werfen, so dass _.some seine Magie tun.

Wenn Sie einen schöneren Wrapper möchten, anstatt ihn manuell mit [] zu übertragen, können wir eine Funktion schreiben, die das Casting umschließt.

var checkTruth = function(obj, keyValueCheck) { 
    return _.some([obj], keyValueCheck); 
}; 

console.log(checkTruth(obj, {code: 2})); 
... as above, just using the `checkTruth` function now ... 
+0

Ich möchte eine Funktion, die ich ein Schlüssel/Wert-Paar übergeben kann! – Bazinga

+0

Mein schlechtes für das Missverständnis Ihrer Frage. Überarbeitet mit der '_.some' Lösung. –

+0

Ich mag den "Trick". Scheint so, als gäbe es solche Funktionen unter der Haube. Ich frage mich, ob es einen einfacheren Weg gibt, um ein neues Array zu erstellen. – AlexStack

Verwandte Themen