Bagaimana cara mengubah Set ke Array?

469

Set sepertinya cara yang bagus untuk membuat Array dengan elemen unik yang dijamin, tetapi tidak memaparkan cara yang baik untuk mendapatkan properti, kecuali untuk generator [Set] .values, yang disebut dengan cara canggung mySet.values.next().

Ini akan baik-baik saja, jika Anda dapat memanggil mapdan fungsi serupa di Sets. Tetapi Anda tidak bisa melakukan itu juga.

Saya sudah mencoba Array.from, tetapi tampaknya hanya mengkonversi objek seperti array (NodeList dan TypedArrays?) Ke Array. Object.keysPercobaan lain: tidak berfungsi untuk Set, dan Set.prototype tidak memiliki metode statis yang sama.

Jadi, pertanyaannya: Apakah ada metode inbuilt yang nyaman untuk membuat Array dengan nilai dari Set yang diberikan? (Urutan elemen tidak terlalu penting).

jika tidak ada pilihan seperti itu, maka mungkin ada satu-liner idiomatik yang bagus untuk melakukan itu? suka, menggunakan for...of, atau serupa?

c69
sumber

Jawaban:

850

jika tidak ada pilihan seperti itu, maka mungkin ada satu-liner idiomatik yang bagus untuk melakukan itu? suka, gunakan untuk ... atau sejenisnya?

Memang, ada beberapa cara untuk mengonversi Set ke Array :

menggunakan Array.from

let array = Array.from(mySet);

Cukup spreadingSet dalam array

let array = [...mySet];

Cara mode lama, beralih dan mendorong ke array baru (Set memiliki forEach)

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

Sebelumnya, menggunakan sintaks pemahaman array non-standar, dan sekarang tidak digunakan lagi:

let array = [v for (v of mySet)];
Adeneo
sumber
7
Ini tidak berfungsi di Safari (8) atau Chrome (41). Tapi itu berhasil di Firefox (35).
425nesp
2
var array = [v for (v of mySet)];tidak bekerja di chrome 46
Eric
18
Saya pikir cara yang paling elegan adalah sederhana [...mySet].
Wojciech Bednarski
18
@WojciechBednarski l33t tidak elegan . Jika ada salah satu contohnya, ituArray.from(mySet);
Buffalo
3
Hanya ingin menambahkan yang [...mySet]memiliki masalah saat dikompilasi menggunakan Typecript (lihat masalah ini ), jadi mungkin lebih aman untuk digunakan Array.from(mySet)jika Anda berniat untuk mengonversi ke Typecript dalam waktu dekat.
Ivan Gozali
65

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

Ternyata, kita bisa menggunakan spreadoperator:

var myArr = [...mySet];

Atau, sebagai alternatif, gunakan Array.from:

var myArr = Array.from(mySet);
c69
sumber
1
mengapa downvote? apakah ada masalah dengan pendekatan ini? Atau seseorang mencoba mengeksekusi kode ini di IE11 dan gagal ? ;)
c69
6
Saya tidak mengundurkan diri, tetapi saya mencoba ini di Chrome versi terbaru dan gagal, jadi ini bukan hanya masalah IE.
Meshaal
3
lihat kangax.github.io/compat-table/es6 untuk bagan dukungan terbaru atau kurang. Saat ini, dari semua browser desktop, hanya FF dan IE TP (alias Spartan, alias browser Non-IE) yang mendukung Array.fromdan...
c69
Sepertinya Firefox adalah satu-satunya browser yang mendukung Array.from. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
425nesp
1
Di sini Anda dapat mengaktifkannya untuk Chrome. chrome://flags/#enable-javascript-harmonyIngat itu eksperimental, jangan berpikir sejenak bahwa ini adalah solusi yang baik untuk pengembangan.
sospedra
12

Dengan anggapan Anda hanya menggunakan Setsementara untuk mendapatkan nilai unik dalam array dan kemudian mengonversi kembali ke Array, coba gunakan ini:

_.uniq([])

Ini bergantung pada penggunaan garis bawah atau tanda hubung .

fremn
sumber
Sayangnya satu-satunya solusi lintas-broser
Marco Sulla
6

Mungkin terlambat ke pesta, tetapi Anda bisa melakukan hal berikut:

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

Ini harus berfungsi tanpa masalah di browser yang memiliki dukungan untuk ES6 atau jika Anda memiliki shim yang dengan benar mengisi fungsi di atas.

Sunting : Hari ini Anda bisa menggunakan apa yang disarankan @ c69:

const set = new Set(['a', 'b']);
const array = [...set]; // or Array.from(set)
Roland
sumber
1
Tampaknya menggunakan set.entries()Anda akan mendapatkan berbagai pasang. Anda dapat menggunakan set.values()untuk mendapatkan array polos.
Shimon Rachlenko
@ShimonRachlenko benar, dan pengguna memang memintanya.
Roland
2
Anda bisa menggunakanvar array = Array.from(set);
Buffalo
jawaban ini salah. Anda tidak perlu dipanggil .entriesjuga .values. Seperti @Buffalo yang disebutkan di atas - Array.from(set)sudah cukup.
c69
1
@ c69 itu benar. Pada saat jawaban ini, Array.from()tidak berfungsi seperti yang diharapkan. Tapi sekarang menyebar dan Array.from()keduanya bekerja dengan baik.
Roland
4

Gunakan spread Operator untuk mendapatkan hasil yang Anda inginkan

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

Dalam kasus saya, solusinya adalah:

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 sama dengan value2 => Nilai yang terkandung dalam posisi saat ini di Set. Nilai yang sama diteruskan untuk kedua argumen

Bekerja di bawah IE11.

d0wn
sumber
0

Menggunakan Set dan mengonversinya menjadi array sangat mirip dengan menyalin Array ...

Jadi Anda dapat menggunakan metode yang sama untuk menyalin array yang sangat mudah di ES6

Misalnya, Anda bisa menggunakan ...

Bayangkan Anda memiliki Perangkat ini di bawah ini:

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

Anda cukup mengonversinya menggunakan:

const b = [...a];

dan hasilnya adalah:

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

Array dan sekarang Anda dapat menggunakan semua metode yang dapat Anda gunakan untuk array ...

Cara umum lain untuk melakukannya:

const b = Array.from(a);

atau menggunakan loop seperti:

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

Kode di bawah ini membuat satu set dari array dan kemudian, menggunakan ...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
sumber
Silakan komentar kode Anda.
Hima
1
..dan ini apa?
ZF007
-1

Berikut adalah cara mudah untuk mendapatkan hanya nilai mentah unik dari array. Jika Anda mengubah array menjadi Set dan setelah ini, lakukan konversi dari Set ke array. Konversi ini hanya berfungsi untuk nilai mentah, untuk objek dalam array tidak valid. Cobalah sendiri.

    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
sumber
-1

JAWABAN SEDERHANA

cukup sebarkan set ke dalam []

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

Hasil : [1,5]

Aljohn Yamaro
sumber