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?

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

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

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 .


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)

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


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.


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

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

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.

-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]

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.