Jak przekonwertować Set na Array?

469

Zestaw wydaje się dobrym sposobem na tworzenie tablic z gwarantowanymi unikalnymi elementami, ale nie ujawnia żadnego dobrego sposobu na uzyskanie właściwości, z wyjątkiem generatora [Set] .values, który jest wywoływany w niezręczny sposób mySet.values.next().

Byłoby dobrze, gdybyś mógł wywoływać mapi podobne funkcje w zestawach. Ale ty też nie możesz tego zrobić.

Próbowałem Array.from, ale wydaje się, że konwertuje tylko obiekty tablicowe (NodeList i TypedArrays?) Na Array. Kolejna próba: Object.keysnie działa dla zestawów, a Set.prototype nie ma podobnej metody statycznej.

Pytanie: czy istnieje jakakolwiek wygodna wbudowana metoda tworzenia tablicy z wartościami danego zestawu? (Kolejność elementów nie ma tak naprawdę znaczenia).

jeśli nie ma takiej opcji, to może jest do tego ładna idiomatyczna linijka? jak, za pomocą for...oflub podobny?

c69
źródło

Odpowiedzi:

850

jeśli nie ma takiej opcji, to może jest do tego ładna idiomatyczna linijka? jak, używając do ... lub podobny?

Rzeczywiście istnieje kilka sposobów konwersji zestawu na macierz :

za pomocą Array.from

let array = Array.from(mySet);

Po prostu spreadingzestaw w tablicy

let array = [...mySet];

Staromodny sposób, iteracja i wypychanie do nowej tablicy (zestawy mają forEach)

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

Wcześniej przy użyciu niestandardowej, a teraz przestarzałej składni zrozumienia tablicy:

let array = [v for (v of mySet)];
adeneo
źródło
7
To nie działa w Safari (8) lub Chrome (41). Ale to działa w przeglądarce Firefox (35).
425nesp
2
var array = [v for (v of mySet)];nie działa w chromie 46
Eric
18
Myślę, że najbardziej elegancki sposób jest po prostu [...mySet].
Wojciech Bednarski
18
@WojciechBednarski l33t nie jest elegancki . Jeśli którykolwiek z przykładów jest taki, toArray.from(mySet);
Buffalo
3
Chciałem tylko dodać, że [...mySet]ma problemy podczas kompilacji przy użyciu Typescript (zobacz ten problem ), więc prawdopodobnie bezpieczniej jest go używać, Array.from(mySet)jeśli zamierzasz przekonwertować na Typescript w najbliższej przyszłości.
Ivan Gozali
65

via https://speakerdeck.com/anguscroll/es6-uncensored by Angus Croll

Okazuje się, że możemy użyć spreadoperatora:

var myArr = [...mySet];

Lub alternatywnie użyj Array.from:

var myArr = Array.from(mySet);
c69
źródło
1
dlaczego głosowanie negatywne? czy są jakieś problemy z tym podejściem? A może ktoś próbował wykonać ten kod w IE11 i nie udało się ? ;)
c69,
6
Nie głosowałem, ale wypróbowałem to w najnowszej wersji Chrome i nie udało mi się, więc nie jest to tylko problem z IE.
Meshaal
3
odnieś się do kangax.github.io/compat-table/es6, aby uzyskać bardziej lub mniej aktualną tabelę wsparcia. Obecnie we wszystkich przeglądarkach stacjonarnych obsługiwane są tylko FF i IE TP (alias Spartan, alias MS Non-IE browser) Array.fromoraz...
c69
Wygląda na to, że Firefox jest jedyną obsługiwaną przeglądarką Array.from. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
425nesp
1
Tutaj możesz włączyć chrome://flags/#enable-javascript-harmonytę funkcję w Chrome. Pamiętaj, że jest eksperymentalna. Nie myśl, że jest to dobre rozwiązanie dla programistów.
sospedra
12

Zakładając, że używasz tylko Settymczasowo, aby uzyskać unikalne wartości w tablicy, a następnie konwertujesz z powrotem na tablicę, spróbuj użyć tego:

_.uniq([])

Polega to na użyciu podkreślenia lub lo-dash .

Fremn
źródło
Niestety jedyne rozwiązanie cross-broser
Marco Sulla,
6

Być może za późno na imprezę, ale możesz po prostu wykonać następujące czynności:

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

Powinno to działać bez problemów w przeglądarkach obsługujących ES6 lub jeśli masz podkładkę, która poprawnie wypełnia powyższą funkcjonalność.

Edycja : Dzisiaj możesz po prostu użyć sugestii @ c69:

const set = new Set(['a', 'b']);
const array = [...set]; // or Array.from(set)
Roland
źródło
1
Wygląda na to, że korzystając z set.entries()nich otrzymasz szereg par. Możesz użyć, set.values()aby uzyskać zwykłą tablicę.
Shimon Rachlenko
@ShimonRachlenko prawda, a użytkownik o to poprosił.
Roland
2
Możesz po prostu użyćvar array = Array.from(set);
Buffalo
ta odpowiedź jest po prostu zła. Nie potrzebujesz połączenia z .entries, ani .values. Jak wspomniano powyżej @ Buffalo - Array.from(set)wystarczy.
c69,
1
@ c69 to prawda. W momencie udzielenia odpowiedzi Array.from()nie działał zgodnie z oczekiwaniami. Ale teraz się rozprzestrzeniają i Array.from()oba działają dobrze.
Roland
4

Użyj operatora rozprzestrzeniania, aby uzyskać pożądany wynik

var arrayFromSet = [...set];
Vignesh Murugan
źródło
0

W moim przypadku rozwiązaniem było:

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);

wartość1 równa się wartości2 => Wartość zawarta w bieżącej pozycji w zbiorze. Ta sama wartość jest przekazywana dla obu argumentów

Pracował pod IE11.

d0wn
źródło
0

Używanie zestawu i konwertowanie go na tablicę jest bardzo podobne do kopiowania tablicy ...

Możesz więc użyć tych samych metod do kopiowania tablicy, co jest bardzo łatwe w ES6

Na przykład możesz użyć ...

Wyobraź sobie, że masz ten zestaw poniżej:

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

Możesz po prostu przekonwertować go za pomocą:

const b = [...a];

a wynikiem jest:

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

Tablica, a teraz możesz używać wszystkich metod, których możesz użyć dla tablicy ...

Inne typowe sposoby robienia tego:

const b = Array.from(a);

lub używając pętli takich jak:

const b = [];
a.forEach(v => b.push(v));
Alireza
źródło
0

Poniższy kod tworzy zestaw z tablicy, a następnie za pomocą ...operatora.

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
źródło
Skomentuj swój kod.
Hima
1
..i co to jest?
ZF007,
-1

Oto prosty sposób na uzyskanie tylko unikatowych wartości surowych z tablicy. Jeśli konwertujesz tablicę na Set, a następnie wykonaj konwersję z Set na tablicę. Ta konwersja działa tylko dla surowych wartości, dla obiektów w tablicy nie jest poprawna. Wypróbuj sam.

    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
źródło
-1

NAJPROSTSZA ODPOWIEDŹ

po prostu rozłóż zestaw wewnątrz []

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

Wynik : [1,5]

Aljohn Yamaro
źródło