Ich versuche zu überprüfen, ob ein Array von Objekten ein Objekt enthält. Ich möchte, dass es true zurückgibt, wenn sich ein Objekt im Array befindet, das dieselben Werte hat und die Objekt-ID keine Rolle spielen sollte. So dachte ich, es würde funktionieren:

let arr = [{r:0, g:1}];
let obj = {r:0, g:1}

console.log(arr.includes(obj));

Aber es gibt false zurück und ich brauche es, um true zurückzugeben. Muss ich jedes Objekt im Array mit JSON.stringify () und dem gesuchten Objekt wie folgt in einen String konvertieren:

let arr = [JSON.stringify({r: 0, g: 1})]
let obj = {r: 0, g: 1}

console.log(arr.includes(JSON.stringify(obj)));

Gibt es eine andere einfachere und effizientere Möglichkeit, dies mit mehr Objekten zu tun?

5
Sackidude 23 Feb. 2020 im 17:18

4 Antworten

Beste Antwort

JSON.stringify funktioniert nicht wie erwartet, wenn Sie die Reihenfolge der Eigenschaften in einem der Objekte ändern.

Sie können .some in Kombination mit isEqual von lodash (oder anderen Alternativen) verwenden. Oder Sie können es selbst schreiben, aber seien Sie vorsichtig, es gibt zu viele Randfälle. Deshalb empfehle ich, einen vorhandenen Ansatz zu verwenden. Das Rad muss nicht neu erfunden werden.

let arr = [JSON.stringify({r: 0, g: 1})]
let obj = {g: 1, r: 0}

console.log(arr.includes(JSON.stringify(obj)));

let arr2 = [{r:0, g:1}];
let obj2 = {g:1, r:0};

console.log(arr2.some(item => _.isEqual(item, obj2)));
console.log(_.some(arr2, item => _.isEqual(item, obj2))); // more canonical way
<script src="https://cdn.jsdelivr.net/lodash/4/lodash.min.js"></script>
1
artanik 23 Feb. 2020 im 15:52

Mit der JavaScript-Methode some () können Sie herausfinden, ob ein JavaScript-Array ein Objekt enthält.

Diese Methode testet, ob mindestens ein Element im Array den von der bereitgestellten Funktion implementierten Test besteht. Hier ist ein Beispiel, das zeigt, wie es funktioniert:

 // An array of objects
    var persons = [{name: "Harry"}, {name: "Alice"}, {name: "Peter"}];

    // Find if the array contains an object by comparing the property value
    if(persons.some(person => person.name === "Peter")){
        alert("Object found inside the array.");
    } else{
        alert("Object not found.");
    }

Beachten Sie, dass es nicht funktioniert, wenn Sie versuchen, das Objekt in einem Array mit der Methode indexOf() wie persons.indexOf({name: "Harry"}) zu finden (geben Sie immer -1 zurück). Weil zwei unterschiedliche Objekte nicht gleich sind, selbst wenn sie gleich aussehen (d. H. Dieselben Eigenschaften und Werte haben). Ebenso sind zwei unterschiedliche Arrays nicht gleich, selbst wenn sie dieselben Werte in derselben Reihenfolge haben.

Die Methode some() wird in allen gängigen Browsern wie Chrome, Firefox, IE (9 und höher) usw. unterstützt. Weitere Informationen zur Notation von Pfeilfunktionen finden Sie im Tutorial zu JavaScript ES6-Funktionen.

1
Husniddin Qurbonboyev 23 Feb. 2020 im 14:31

Sie erhalten false, weil Objekte durch einen Verweis auf das Objekt verglichen werden, während Sie dort 2 separate Objektinstanzen erhalten haben.

Wenn JSON.stringify möglicherweise funktioniert, beachten Sie, dass die Reihenfolge der Eigenschaften nicht garantiert ist und fehlschlagen kann, wenn die Reihenfolge nicht identisch ist, da Sie eine andere Zeichenfolge erhalten.

Sie können nach einer id -Eigenschaft suchen oder mehrere Eigenschaften vergleichen, mit denen Sie übereinstimmen möchten. Wenn Sie müssen, können Sie alle Eigenschaften mit einer Schleife vergleichen.

Wenn Sie Zugriff auf die Objektreferenz haben, können Sie eine Map oder eine Set verwenden, mit der Sie Referenzen speichern und überprüfen können

const obj = {r:0, g:1};
const obj2 = {r:0, g:1};
const mySet = new Set();
// given the fact that you do have access to the object ref
mySet.add(obj);

const isObjInList = mySet.has(obj);
const isObj2InList = mySet.has(obj2);

console.log('is obj in list - ', isObjInList);
console.log('is obj2 in list - ', isObj2InList);
1
Sagiv b.g 23 Feb. 2020 im 14:31

Ich verwende gerne Set() Lesen Sie dazu die Dokumentation:

Mit dem Set-Objekt können Sie eindeutige Werte eines beliebigen Typs speichern, unabhängig davon, ob es sich um primitive Werte oder Objektreferenzen handelt.

Siehe das folgende Beispiel:

let obj = {r:0, g:1};
const set = new Set();
set.add(obj);

console.log(set.has(obj));

Ich hoffe das hilft!

1
norbitrial 23 Feb. 2020 im 14:23