Wie konvertiere ich Set in Array?

469

Set scheint eine gute Möglichkeit zu sein, Arrays mit garantierten eindeutigen Elementen zu erstellen, bietet jedoch keine gute Möglichkeit, Eigenschaften abzurufen, mit Ausnahme von Generator [Set] .values, die auf unangenehme Weise aufgerufen werden mySet.values.next().

Dies wäre in Ordnung gewesen, wenn Sie mapähnliche Funktionen für Sets aufrufen könnten . Aber das kannst du auch nicht.

Ich habe es versucht Array.from, aber es scheint nur Array-ähnliche Objekte (NodeList und TypedArrays?) In Array zu konvertieren. Ein weiterer Versuch: Object.keysfunktioniert nicht für Sets, und Set.prototype verfügt nicht über eine ähnliche statische Methode.

Die Frage: Gibt es eine bequeme eingebaute Methode zum Erstellen eines Arrays mit Werten eines bestimmten Satzes? (Die Reihenfolge der Elemente spielt keine Rolle).

Wenn es keine solche Option gibt, gibt es vielleicht einen netten idiomatischen Einzeiler dafür? wie, mit for...ofoder ähnlich?

c69
quelle

Antworten:

850

Wenn es keine solche Option gibt, gibt es vielleicht einen netten idiomatischen Einzeiler dafür? wie, für ... von oder ähnlich?

In der Tat gibt es verschiedene Möglichkeiten, ein Set in ein Array zu konvertieren :

mit Array.from

let array = Array.from(mySet);

Einfach spreadingdas Set in einem Array

let array = [...mySet];

Die alte Art und Weise, iterieren und auf ein neues Array verschieben (Sets haben forEach)

let array = [];
mySet.forEach(v => array.push(v));

Bisher wurde die nicht standardmäßige und jetzt veraltete Syntax für das Array-Verständnis verwendet:

let array = [v for (v of mySet)];
Adeneo
quelle
7
Dies funktioniert nicht in Safari (8) oder Chrome (41). Aber es funktioniert in Firefox (35).
425nesp
2
var array = [v for (v of mySet)];funktioniert nicht in Chrom 46
Eric
18
Ich denke, der eleganteste Weg ist einfach [...mySet].
Wojciech Bednarski
18
@WojciechBednarski l33t ist nicht elegant . Wenn eines der Beispiele das ist, ist esArray.from(mySet);
Buffalo
3
Ich wollte nur hinzufügen, dass [...mySet]beim Kompilieren mit Typescript Probleme auftreten (siehe dieses Problem ). Daher ist die Verwendung wahrscheinlich sicherer, Array.from(mySet)wenn Sie in naher Zukunft auf Typescript konvertieren möchten.
Ivan Gozali
65

über https://speakerdeck.com/anguscroll/es6-uncensored von Angus Croll

Es stellt sich heraus, wir können spreadOperator verwenden:

var myArr = [...mySet];

Oder verwenden Sie alternativ Array.from:

var myArr = Array.from(mySet);
c69
quelle
1
Warum eine Ablehnung? Gibt es Probleme mit diesem Ansatz? Oder hat jemand versucht, diesen Code in IE11 auszuführen und ist fehlgeschlagen ? ;)
c69
6
Ich habe nicht abgelehnt, aber ich habe dies in der neuesten Version von Chrome versucht und bin fehlgeschlagen. Es handelt sich also nicht nur um ein IE-Problem.
Meshaal
3
siehe kangax.github.io/compat-table/es6 für mehr oder weniger up-to-date Unterstützung Chart. Derzeit unterstützen von allen Desktop-Browsern nur FF und IE TP (auch bekannt als Spartan, auch bekannt als MS Non-IE Browser) Array.fromund...
c69
Es sieht so aus, als ob Firefox der einzige Browser ist, der dies unterstützt Array.from. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
425nesp
1
Hier können Sie es für Chrome aktivieren. chrome://flags/#enable-javascript-harmonyDenken Sie daran, dass es experimentell ist. Denken Sie im Moment nicht, dass dies eine gute Lösung für die Entwicklung ist.
Sospedra
12

Angenommen, Sie verwenden nur Setvorübergehend, um eindeutige Werte in einem Array abzurufen und dann wieder in ein Array zu konvertieren, versuchen Sie Folgendes:

_.uniq([])

Dies hängt von der Verwendung von Unterstrich oder Bindestrich ab .

fremn
quelle
Leider die einzige Cross-Broser-Lösung
Marco Sulla
6

Vielleicht zu spät zur Party, aber Sie könnten einfach Folgendes tun:

const set = new Set(['a', 'b']);
const values = set.values();
const array = Array.from(values);

Dies sollte problemlos in Browsern funktionieren, die ES6 unterstützen, oder wenn Sie eine Unterlegscheibe haben, die die oben genannten Funktionen korrekt ausfüllt.

Bearbeiten : Heute können Sie einfach verwenden, was @ c69 vorschlägt:

const set = new Set(['a', 'b']);
const array = [...set]; // or Array.from(set)
Roland
quelle
1
Es scheint, dass Sie mit dem set.entries()Array von Paaren erhalten. Sie können verwenden set.values(), um das einfache Array zu erhalten.
Shimon Rachlenko
@ShimonRachlenko wahr, und der Benutzer hat danach gefragt.
Roland
2
Sie können nur verwendenvar array = Array.from(set);
Buffalo
Diese Antwort ist einfach falsch. Sie brauchen den Anruf nicht .entries, noch .values. Wie @Buffalo oben erwähnt - Array.from(set)ist genug.
c69
1
@ c69 das ist wahr. Zum Zeitpunkt dieser Antwort Array.from()funktionierte nicht wie erwartet. Aber jetzt verbreiten und Array.from()beide funktionieren gut.
Roland
4

Verwenden Sie den Spread-Operator, um das gewünschte Ergebnis zu erzielen

var arrayFromSet = [...set];
Vignesh Murugan
quelle
0

In meinem Fall war die Lösung:

var testSet = new Set();
var testArray = [];

testSet.add("1");
testSet.add("2");
testSet.add("2"); // duplicate item
testSet.add("3");

var someFunction = function (value1, value2, setItself) {
    testArray.push(value1);
};

testSet.forEach(someFunction);

console.log("testArray: " + testArray);

value1 ist gleich value2 => Der Wert, der in der aktuellen Position im Set enthalten ist. Für beide Argumente wird der gleiche Wert übergeben

Arbeitete unter IE11.

d0wn
quelle
0

Die Verwendung von Set und die Konvertierung in ein Array ist dem Kopieren eines Arrays sehr ähnlich ...

Sie können also dieselben Methoden zum Kopieren eines Arrays verwenden, was in ES6 sehr einfach ist

Zum Beispiel können Sie verwenden ...

Stellen Sie sich vor, Sie haben dieses Set unten:

const a = new Set(["Alireza", "Dezfoolian", "is", "a", "developer"]);

Sie können es einfach konvertieren mit:

const b = [...a];

und das Ergebnis ist:

["Alireza", "Dezfoolian", "is", "a", "developer"]

Ein Array und jetzt können Sie alle Methoden verwenden, die Sie für ein Array verwenden können ...

Andere übliche Methoden:

const b = Array.from(a);

oder mit Schleifen wie:

const b = [];
a.forEach(v => b.push(v));
Alireza
quelle
0

Der folgende Code erstellt eine Menge aus einem Array und verwendet dann den ...Operator.

var arr=[1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,];
var set=new Set(arr);
let setarr=[...set];
console.log(setarr);
Ekram Mallick
quelle
Bitte kommentieren Sie Ihren Code.
Hima
1
..und das ist was?
ZF007
-1

Hier ist eine einfache Möglichkeit, nur eindeutige Rohwerte aus dem Array abzurufen. Wenn Sie das Array in Set konvertieren und danach die Konvertierung von Set in Array durchführen. Diese Konvertierung funktioniert nur für Rohwerte, für Objekte im Array ist sie ungültig. Probieren Sie es selbst aus.

    let myObj1 = {
        name: "Dany",
        age: 35,
        address: "str. My street N5"
    }

    let myObj2 = {
        name: "Dany",
        age: 35,
        address: "str. My street N5"
    }

    var myArray = [55, 44, 65, myObj1, 44, myObj2, 15, 25, 65, 30];
    console.log(myArray);

    var mySet = new Set(myArray);
    console.log(mySet);

    console.log(mySet.size === myArray.length);// !! The size differs because Set has only unique items

    let uniqueArray = [...mySet];
    console.log(uniqueArray); 
    // Here you will see your new array have only unique elements with raw 
    // values. The objects are not filtered as unique values by Set.
    // Try it by yourself.
zdrsoft
quelle
-1

EINFACHSTE ANTWORT

Verteile das Set einfach in []

let mySet = new Set()
mySet.add(1)
mySet.add(5)
mySet.add(5) 
let arr = [...mySet ]

Ergebnis : [1,5]

Aljohn Yamaro
quelle