2017-06-01 3 views
1

Ich habe ein Array mit mehreren Objekten als Einträge (Sammlung) gegeben und ich möchte überprüfen, ob ein anderes Quellobjekt in diesen einzelnen Eintrag Objekte ist. Wenn dem so ist, möchte ich ein Array mit allen Objekten zurückgeben, die diese Bedingung erfüllen. Hier ist der Code mit einem Beispiel:Wie kann JavaScript eingecheckt werden, wenn sich das Objekt in einem Array mit mehreren Objekten befindet?

function whatIsInAName(collection, source) { 
    var arr = []; 
    var sourceEntries = Object.entries(source); 
    for (var i = 0; i < collection.length; i++) { 
     for (var j = 0; i < sourceEntries.length; i ++) { 
      if((collection[i].hasOwnProperty(sourceEntries[j][0]))) { 
       if(collection[i][sourceEntries[j][0]] == sourceEntries[j][1]) { 
        /*what happens here*/ 
       } 
      } 
     arr.push(collection[i]); 
     } 

    } 
    return arr; 
} 

print(whatIsInAName([{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }], { "a": 1, "b": 2 })); 

Offensichtlich Ich weiß nicht, was zu setzen, wo es geschrieben ist („Was passiert hier“). Das Problem ist im Grunde, dass die zweite for-Schleife und beide Bedingungen true sein müssen, damit der Push-Befehl sinnvoll ist.

schätze ich jeden Hinweis oder helfen, danke!

P.S. Ich weiß, dass dies wahrscheinlich nicht der eleganteste Weg ist, es zu lösen, und freue mich auch über andere Lösungen.

+0

Können Sie eine Beispieleingabe und -ausgabe geben? Ich denke, das würde jemandem helfen, herauszufinden, was genau Sie brauchen. –

+0

Ich meine, je nachdem, wie gründlich Sie wirklich sein wollen, könnten Sie einfach testen, ob 'JSON.stringify (item_in_array) == JSON.stringify (search_object)' – Jhecht

+0

Natürlich, @ArnavAggarwal! Also im Grunde, was es in der print-Anweisung ist, ist die Eingabe, Ausgabe sollte sein: '[{" a ": 1," b ": 2}, {" a ": 1," b ": 2," c ": 3}]", weil diese beiden Objekte sowohl 'a' als auch 'b' enthalten. –

Antwort

2

Dies ist, wo die eingebaute in .filter Funktion ist praktisch:

function whatIsInAName(collection, source) { 
 
    return collection.filter((obj) => { 
 
    for (var prop in source) { 
 
     if (source[prop] !== obj[prop]) { 
 
     // The source property is not found in obj - no good! 
 
     return false; 
 
     } 
 
     // The source property matches one of the obj's properties - keep going! 
 
    } 
 
    // Made it through the checks! You've got a match! 
 
    return true; 
 
    }); 
 
} 
 

 
console.log(whatIsInAName([{ 
 
    "a": 1, 
 
    "b": 2 
 
}, { 
 
    "a": 1 
 
}, { 
 
    "a": 1, 
 
    "b": 2, 
 
    "c": 2 
 
}], { 
 
    "a": 1, 
 
    "b": 2 
 
}));

Oder, wenn Sie geneigt sind, eine Bibliothek zu verwenden, dies zu tun, kann es sehr getan werden einfach mit Lodash:

var collection = [{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }], 
 
    source = { "a": 1, "b": 2 }; 
 

 
console.log(_.filter(collection, source));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

+0

Danke, @ j-titus Glatte und elegante Lösung. Sehr geschätzt! –

Verwandte Themen