2017-07-29 4 views

Antwort

5

nicht auf diese Weise, dass für das spezifische Objekt aussehen würden Sie im Vorbeigehen sind, die nicht in der Gruppe ist.

Wenn Ihr Ausgangspunkt ein Array von Objekten ist, brauchen Sie nicht ein Set überhaupt, nur Array.prototype.find:

let myObjects = [{"name":"a", "value":0}, {"name":"b", "value":1},{"name":"c", "value":2}]; 
 
let found = myObjects.find(e => e.name === "a"); 
 
console.log(found);

Wenn Sie bereits ein Set haben und suchen möchten Für eine Übereinstimmung können Sie ihren Iterator verwenden, entweder direkt über for-of:

let myObjects = [{"name":"a", "value":0}, {"name":"b", "value":1},{"name":"c", "value":2}]; 
 
let mySet = new Set(myObjects); 
 
let found = undefined; // the `= undefined` is just for emphasis; that's the default value it would have without an initializer 
 
for (const e of mySet) { 
 
    if (e.name === "a") { 
 
    found = e; 
 
    break; 
 
    } 
 
} 
 
console.log(found);

... oder indirekt über Array.from (wieder) schaffen (die) ein Array, und verwenden Sie dann find:

let myObjects = [{"name":"a", "value":0}, {"name":"b", "value":1},{"name":"c", "value":2}]; 
 
let mySet = new Set(myObjects); 
 
let found = Array.from(mySet).find(e => e.name === "a"); 
 
console.log(found);


Wenn es etwas ist, Sie müssen Sie oft tun, können Sie sich selbst eine Dienstprogrammfunktion dafür geben:

const setFind = (set, cb) => { 
 
    for (const e of set) { 
 
    if (cb(e)) { 
 
     return e; 
 
    } 
 
    } 
 
    return undefined; // undefined` just for emphasis, `return;` 
 
        // would do effectively th same thing, as 
 
        // indeed would just not having a `return` 
 
        // at at all 
 
} 
 

 
let myObjects = [{"name":"a", "value":0}, {"name":"b", "value":1},{"name":"c", "value":2}]; 
 
let mySet = new Set(myObjects); 
 
let found = setFind(mySet, e => e.name === "a"); 
 
console.log(found);

Sie auch, dass setzen könnte auf Set.prototype (was sicher, dass es nicht-zählbare), aber hüte dich vor mit zukünftigen Erweiterungen Set Konflikt (zum Beispiel würde ich überhaupt sein nicht überrascht wenn Set.prototype eine find Methode irgendwann bekommen).

+0

Vielen Dank für Ihre Antwort, meine Frage war einfach aus Neugier, wie ich irgendwo gelesen, dass in einem 'Set' Suche Objekt hat eine Komplexität von O (1). –

+0

* Prüfen, ob etw drin ist *! == * Suchen * –

+0

@Jonasw: True! Alexandre, wenn du nur ein boolsches Ergebnis willst, benutze 'some' statt' find' oben (und passe die 'for-of' entsprechend an). –

5

Vielleicht möchten Sie einfach eine Reihe von Namen:

let myObjects = [{"name":"a", "value":0}, {"name":"b", "value":1},{"name":"c", "value":2}]; 

let map = new Set(myObjects.map(el=>el.name)); 
console.log(map.has("a")); 

Wenn Sie ein Objekt mit Namen erhalten möchten, das ist, was ein Map ist für:

let myObjects = [{"name":"a", "value":0}, {"name":"b", "value":1},{"name":"c", "value":2}]; 

let map = new Map(myObjects.map(el=>[el.name,el])); 
console.log(map.get("a")); 
+1

Während 'Map' funktioniert, ist das was ein * set * ist für:' let mySet = new Set (myObjects.map (e => e.name)); console.log (mySet.has ("a")); '(wenn wir es so lösen wollen). –

1

Kurze Antwort - nein . Set.has arbeitet auf Objektgleichheit, und jedes Objekt in der Liste ist eindeutig - wenn Sie also ein neues Objekt an .has übergeben, gibt es true nicht zurück, auch wenn es die gleichen Schlüssel und Werte hat.

Sie könnten immer die ursprüngliche Liste filtern, und wenn die resultierende Liste eine Länge größer als Null hat, wird Ihr Objekt darin enthalten sein.

const containsObjectWithName = ({ name }) => 
    !!myObjects 
    .filter((obj) => obj.name === name) 
    .length; 

containsObjectWithName({ name: 'a' }); // true 
2

Wenn Sie dies mit einem Set tun wollen, dann ist das Objekt die Sie suchen hat das gleiche Objekt sein, die hinzugefügt wurde, kein anonymes Objekt.

So können Sie erreichen, was Sie suchen, wenn es wurde wie folgt aufgebaut:

let myObject = {"name": "a", "value": 0}; 
let set = new Set([myObject]); 

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

Dies liegt daran, set.has()SameValueZero() unter der Haube verwendet. Hier

ist die Spezifikation für set.has(): http://www.ecma-international.org/ecma-262/6.0/#sec-set.prototype.has

Und für SameValueZero(): http://www.ecma-international.org/ecma-262/6.0/#sec-samevaluezero

+0

Das tut nicht was der OP gefragt hat. Die Frage hat ganz klar zwei getrennte Objekte (eines im Array und ein ** anderes **, nach dem gesucht wird), kein einzelnes Objekt. –

Verwandte Themen