Zu setzendes JavaScript-Array

144

MSDN verweist auf die Set- Sammlungsabstraktion von JavaScript . Ich habe eine Reihe von Objekten, die ich in eine Menge konvertieren möchte, damit ich .delete()verschiedene Elemente nach Namen entfernen kann :

var array = [
    {name: "malcom", dogType: "four-legged"},
    {name: "peabody", dogType: "three-legged"},
    {name: "pablo", dogType: "two-legged"}
];

Wie konvertiere ich dieses Array in einen Satz? Ist es insbesondere möglich, dies zu tun, ohne über das obige Array zu iterieren? Die Dokumentation fehlt relativ (ausreichend für instanziierte Sets; nicht für Conversions - wenn möglich).

Ich denke vielleicht auch an die Konvertierung in eine Karte , um sie per Schlüssel zu entfernen. Was ich versuche zu erreichen, ist eine iterierbare Sammlung, auf die zugegriffen oder geändert werden kann, indem auf die Elemente hauptsächlich über einen Schlüssel zugegriffen wird (im Gegensatz zum Index).

Die Konvertierung von einem Array in das andere ist das ultimative Ziel.

Thomas
quelle
1
klingt wie ein einfaches altes Objekt wird für Sie arbeiten ...
Dandavis
3
@ Thomas: Also mir fehlt etwas, was ich lernen möchte. Was ist der Unterschied zwischen var s = new Set (), Hinzufügen von Objekten und Ausgeben von s.delete (was auch immer) - und var o = {1: 'aaa', 2: 'bbbb' ...} und Ausgeben von delete (o [ '1'])?
Veverke
1
@Veverke, das war aussagekräftiger als Ihr erster Kommentar (+1). Danke dir. Aber ist es wieder möglich, dies zu tun, ohne das Array zu durchlaufen, um den Inhalt des Arrays zum Objekt hinzuzufügen und eine listähnliche, über Schlüssel zugängliche Struktur beizubehalten? Klingt so, als hättest du eine Idee. Es würde mir nichts ausmachen, es in einem Antwortformat zu sehen, wenn Sie die Zeit haben, es auszuarbeiten.
Thomas
2
Dieses Array-Objekt ist nicht legal, da {"bob", "dole"}es kein gültiges Objekt ist.
Alnitak
1
@Veverke ES6 Setund Mapsind "reine" Implementierung jener Datenkonstrukte, die nicht unter den Problemen leiden, die eine ObjectDose hat, wenn Dinge zu ihrem Prototyp hinzugefügt werden.
Alnitak

Antworten:

203

Übergeben Sie das Array einfach an den Set-Konstruktor. Der Set-Konstruktor akzeptiert einen iterableParameter. Das Array-Objekt implementiert das iterableProtokoll, ist also ein gültiger Parameter.

var arr = [55, 44, 65];
var set = new Set(arr);
console.log(set.size === arr.length);
console.log(set.has(65));

Siehe hier

levi
quelle
streng korrekt, obwohl ich gezögert habe, selbst eine Antwort hinzuzufügen, da die Daten des OP fehlerhaft sind und es daher unklar ist, was genau er erwartet
Alnitak
10
Dies funktioniert unter IE11 nicht. Dieser Konstruktor wird nicht unterstützt. Ich würde es vermeiden, wenn Sie nicht wissen, welche Browser Ihre Benutzer verwenden werden.
Eric
10

Wenn Sie beginnen mit:

let array = [
    {name: "malcom", dogType: "four-legged"},
    {name: "peabody", dogType: "three-legged"},
    {name: "pablo", dogType: "two-legged"}
];

Und Sie möchten eine Reihe von beispielsweise Namen, die Sie tun würden:

let namesSet = new Set(array.map(item => item.name));
Ryan Shillington
quelle
3

Was Levi über die Übergabe an den Konstruktor gesagt hat, ist richtig, aber Sie können auch ein Objekt verwenden.

Ich denke, Veverke versucht zu sagen, dass Sie das deleteSchlüsselwort leicht für ein Objekt verwenden können, um den gleichen Effekt zu erzielen.

Ich denke, Sie sind durch die Terminologie verwirrt; Eigenschaften sind Komponenten des Objekts, die Sie als benannte Indizes verwenden können (wenn Sie es so sehen möchten).

Versuchen Sie so etwas:

var obj = {
    "bob": "dole",
    "mr.": "peabody",
    "darkwing": "duck"
};

Dann könnten Sie einfach Folgendes tun:

delete obj["bob"];

Die Struktur des Objekts wäre dann:

{
    "mr.": "peabody",
    "darkwing": "duck"
}

Welches hat den gleichen Effekt.

AstroCB
quelle
1
Danke Astro :-). Dies warf in der Tat die Frage auf: "Was ist der Unterschied zwischen einem Set-Objekt und einem einfachen Objekt?" Obwohl, wie ich in den obigen Kommentaren bemerkt habe, "Set" ein Wrap-Up-Typ ist, der die "nice to have-Funktionalität" von "clear" bietet.
Veverke
Kurz gesagt, ich denke, der Titel des Beitrags sollte in "Was ist der Unterschied zwischen einem Set-Objekt und einem einfachen Objekt in Javascript?" Geändert werden Was ist der Unterschied zwischen ...
Veverke
@Veverke "Was ist der Unterschied zwischen einem Set-Objekt und einem einfachen Objekt?", Könnte gerade das Dokument lesen.
Hacketo
1
@ Hacketo: findest du etwas anderes als Set, das "Clear" in seiner API bereitstellt?
Veverke
1
Dies ist eine interessante Antwort - denken Sie, es verdient mehr Kredit als es erhalten hat. Hat mich zum Nachdenken gebracht. Danke dir!
Thomas
2

Per Definition "Ein Satz ist eine Sammlung von Werten, wobei jeder Wert nur einmal vorkommen darf." Wenn Ihr Array wiederholte Werte hat, wird nur ein Wert unter den wiederholten Werten zu Ihrem Set hinzugefügt.

var arr = [1, 2, 3];
var set = new Set(arr);
console.log(set); // {1,2,3}


var arr = [1, 2, 1];
var set = new Set(arr);
console.log(set); // {1,2}

Konvertieren Sie also nicht in set, wenn Sie wiederholte Werte in Ihrem Array haben.

Ashlesh Sortee
quelle