Nasıl Array dönüştürmek için?


469

Set , garantili benzersiz unsurlarla Diziler oluşturmak için iyi bir yol gibi görünüyor, ancak garip bir şekilde çağrılan jeneratör [Set] .values ​​dışında özellikler elde etmek için iyi bir yol göstermiyor mySet.values.next().

Eğer mapSetler üzerinde benzer fonksiyonları çağırabilirseniz, bu tamam olurdu . Ama bunu da yapamazsın.

Denedim Array.from, ama Array için sadece dizi benzeri (NodeList ve TypedArrays?) Nesneleri dönüştürme gibi görünüyor. Başka bir deneme: Object.keysSetler için çalışmaz ve Set.prototype benzer statik yöntemi yoktur.

Yani, soru: Belirli bir Kümenin değerlerine sahip bir Array oluşturmak için herhangi bir uygun dahili yöntem var mı? (Eleman sırası gerçekten önemli değildir).

böyle bir seçenek yoksa, belki bunu yapmak için güzel bir deyim tek astar var mı? beğenmek, kullanmak for...ofveya benzeri?

Yanıtlar:


851

böyle bir seçenek yoksa, belki bunu yapmak için güzel bir deyim tek astar var mı? gibi, kullanma ... veya benzeri?

Gerçekten de, bir dönüştürmek için çeşitli yolları vardır Set bir etmek Array :

kullanma Array.from

let array = Array.from(mySet);

Basitçe spreadingbir dizide yola çıkma

let array = [...mySet];

Eski moda yolu, yineleme ve yeni bir diziye itme (Setler var forEach)

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

Önceden, standart olmayan ve şimdi kullanımdan kaldırılan dizi anlama sözdizimini kullanarak:

let array = [v for (v of mySet)];

7
Safari (8) veya Chrome'da (41) çalışmaz. Ancak Firefox'ta (35) çalışıyor.
425nesp

2
var array = [v for (v of mySet)];krom 46'da çalışmıyor
Eric

18
Bence en zarif yol basitçe [...mySet].
Wojciech Bednarski

18
@WojciechBednarski l33t zarif değil . Örneklerden herhangi biri bu ise, buArray.from(mySet);
Buffalo

3
[...mySet]Typescript kullanarak derlendiğinde sorunların olduğunu eklemek istedim ( bu konuya bakın ), bu yüzden Array.from(mySet)yakın gelecekte Typescript'e dönüştürmek istiyorsanız kullanmanız daha güvenli olacaktır.
Ivan Gozali

65

ile https://speakerdeck.com/anguscroll/es6-uncensored Angus Croll tarafından

Anlaşılan, spreadoperatörü kullanabiliriz :

var myArr = [...mySet];

Veya alternatif olarak Array.fromşunları kullanın :

var myArr = Array.from(mySet);

1
neden bir aşağı oy? bu yaklaşımla ilgili herhangi bir sorun var mı? Ya da biri IE11'de bu kodu yürütmeye çalıştı ve başarısız oldu ? ;)
c69

6
İndirmedim, ancak Chrome'un en son sürümünde denedim ve başarısız oldum, bu yüzden sadece bir IE sorunu değil.
Meshaal

3
daha fazla veya daha az güncel destek tablosu için kangax.github.io/compat-table/es6 adresine bakın . Şu anda, tüm masaüstü tarayıcılar, sadece FF ve IE TP (aka Spartan, aka MS IE olmayan tarayıcı) desteği Array.fromve...
c69

Firefox'un desteklediği tek tarayıcı olduğu anlaşılıyor Array.from. developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/…
425nesp

1
Burada Chrome için etkinleştirebilirsiniz. chrome://flags/#enable-javascript-harmonyDeneysel bir an için bunun geliştirme için iyi bir çözüm olduğunu düşünmeyin.
sospedra

12

SetBir dizide benzersiz değerler elde etmek için geçici olarak kullandığınızı ve ardından bir Diziye geri dönüştürdüğünüzü varsayarsak, bunu kullanmayı deneyin:

_.uniq([])

Bu alt çizgi veya lo-tire kullanmaya dayanır .


Ne yazık ki tek çapraz çözüm
Marco Sulla

6

Partiye geç kalmış olabilirsiniz, ancak aşağıdakileri yapabilirsiniz:

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

Bu, ES6 desteği olan tarayıcılarda veya yukarıdaki işlevselliği doğru bir şekilde çoklu dolduran bir şim varsa sorunsuz çalışmalıdır.

Düzenleme : Bugün @ c69'un önerilerini kullanabilirsiniz:

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

1
Görünüşe göre set.entries()sizi kullanarak çiftler dizisi alacaksınız. set.values()Düz diziyi almak için kullanabilirsiniz .
Shimon Rachlenko

@ShimonRachlenko true ve kullanıcı bunu istedi.
Roland

2
Sadece kullanabilirsinizvar array = Array.from(set);
Buffalo

bu cevap yanlış. Aramaya gerek yok .entries, ne de .values. @Buffalo yukarıda belirtildiği gibi - Array.from(set)yeterlidir.
c69

1
@ c69 bu doğru. Bu cevap sırasında, Array.from()beklendiği gibi çalışmadı. Ama şimdi yayıldı ve Array.from()her ikisi de gayet iyi çalışıyor.
Roland

4

İstediğiniz sonucu elde etmek için spread Operatörünü kullanın

var arrayFromSet = [...set];


0

Set'i kullanmak ve bir diziye dönüştürmek, Diziyi kopyalamaya çok benzer ...

Böylece ES6'da çok kolay olan bir diziyi kopyalamak için aynı yöntemleri kullanabilirsiniz

Örneğin, ...

Bu Sete sahip olduğunuzu düşünün:

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

Bunu kullanarak basitçe dönüştürebilirsiniz:

const b = [...a];

ve sonuç:

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

Bir dizi ve şimdi bir dizi için kullanabileceğiniz tüm yöntemleri kullanabilirsiniz ...

Bunu yapmanın diğer yaygın yolları:

const b = Array.from(a);

veya aşağıdaki gibi döngüler kullanarak:

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

0

Aşağıdaki kod, bir diziden ve sonra ...işleci kullanarak bir küme oluşturur .

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

Lütfen kodunuzu yorumlayın.
Hima

1
..ve bu ne?
ZF007

-1

Diziden yalnızca benzersiz ham değerler almanın kolay bir yolu. Diziyi Set'e dönüştürürseniz ve bundan sonra, Set'ten diziye dönüşüm gerçekleştirin. Bu dönüşüm yalnızca ham değerler için geçerlidir, dizideki nesneler için geçerli değildir. Kendiniz deneyin.

    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

SADECE CEVAP

sadece seti içine ser. []

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

Sonuç : [1,5]

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.