Ayarlanacak JavaScript Dizisi


146

MSDN, JavaScript'in Set koleksiyonu soyutlamasına başvurur. .delete()İsme göre ( ) çeşitli öğeleri kaldırmak mümkün böylece bir kümeye dönüştürmek istiyorum nesneleri bir dizi var :

var array = [
    {name: "malcom", dogType: "four-legged"},
    {name: "peabody", dogType: "three-legged"},
    {name: "pablo", dogType: "two-legged"}
];

Bu diziyi bir kümeye nasıl dönüştürebilirim? Daha spesifik olarak, yukarıdaki diziyi yinelemeden bunu yapmak mümkün müdür? Dokümantasyon nispeten eksiktir (örneklenmiş kümeler için yeterlidir; dönüşümler için değil - mümkünse).

Anahtarla kaldırılmak üzere bir Haritaya dönüşmeyi de düşünüyor olabilirim . Ne başarmaya çalışıyorum (bir endeks aksine) öncelikle bir anahtar yoluyla elemanlara erişerek erişilebilir veya değiştirilebilir yinelenebilir bir koleksiyon.

Bir diziden diğerine dönüşüm nihai hedeftir.


1
sade eski bir nesnenin sizin için çalışacağına
benziyor

3
@Thomas: öğrenmek istediğim bir şey eksik. Var s = new Set (), nesne ekleme ve s.delete (ne olursa olsun) - ve var o = {1: 'aaa', 2: 'bbbb' ...} ve silme (o [ '1'])?
15'te Veverke

1
@Veverke, ilk yorumunuzdan (+1) daha açıklayıcıydı. Teşekkür ederim. Ancak, yine, dizinin içeriğini nesneye eklemek için dizi üzerinde yinelemeden ve anahtarla erişilebilir yapı gibi bir liste tutmak mümkün mü? Bir fikriniz var gibi görünüyor. Eğer ayrıntıya girecek vaktiniz varsa cevap biçiminde görmeyi umursamıyorum.
Thomas

2
{"bob", "dole"}Geçerli bir nesne olmadığı için bu dizi nesnesi yasal değil.
Alnitak

1
@Veverke ES6 Setve prototipine bir şeyler eklendiğinde Mapbir sorunla karşılaşmayan veri yapılarının "saf" uygulamasıdır Object.
Alnitak

Yanıtlar:


207

Diziyi Set yapıcısına iletmeniz yeterlidir. Set yapıcısı bir iterableparametreyi kabul eder . Array nesnesi iterableprotokolü uygular , böylece geçerli bir parametredir.

var arr = [55, 44, 65];
var set = new Set(arr);
console.log(set.size === arr.length);
console.log(set.has(65));

Buraya bakın


kesinlikle doğru, ancak OP'nin verileri yanlış biçimlendirildiğinden kendim bir cevap eklemekten çekinmiştim ve bu nedenle tam olarak ne beklediğinden emin değilim
Alnitak

10
Bu IE11 üzerinde çalışmaz. Bu yapıcıyı desteklemiyor. Kullanıcılarınızın hangi tarayıcıları kullanacağını bilmiyorsanız bundan kaçınırım.
Eric

10

Şununla başlarsanız:

let array = [
    {name: "malcom", dogType: "four-legged"},
    {name: "peabody", dogType: "three-legged"},
    {name: "pablo", dogType: "two-legged"}
];

Ve bir dizi isim istersiniz, örneğin:

let namesSet = new Set(array.map(item => item.name));

3

Levi ne dedi yapıcı içine geçirilmesi konusunda doğrudur, ama aynı zamanda bir nesneyi kullanabilirsiniz.

Veverke'nin söylemeye çalıştığı şey , aynı etkiyi elde etmek için deleteanahtar kelimeyi bir nesne üzerinde kolayca kullanabileceğinizi düşünüyorum .

Bence terminoloji ile kafan karıştı; özellikleri , adlandırılmış dizinler olarak kullanabileceğiniz nesnenin bileşenleridir (bu şekilde düşünmek istiyorsanız).

Bunun gibi bir şey deneyin:

var obj = {
    "bob": "dole",
    "mr.": "peabody",
    "darkwing": "duck"
};

Sonra, bunu sadece yapabilirsiniz:

delete obj["bob"];

Nesnenin yapısı şu şekilde olur:

{
    "mr.": "peabody",
    "darkwing": "duck"
}

Hangi aynı etkiye sahiptir.


1
Teşekkürler Astro :-). Gerçekten, bu şu soruyu açtı: "Set nesnesi ile düz nesne arasındaki fark nedir?" Her ne kadar yukarıdaki yorumlarda belirttiğim gibi, "Set" "açık" işlevselliği güzel "sunan bir sarma türüdür.
Veverke

Kısacası, yazının başlığı "bir set nesnesi ve javascript düz bir nesne arasındaki fark nedir" olarak değiştirilmesi gerektiğini düşünüyorum ve "Bu ve bu elde etmeye çalışırken ... ben kendime sormak sona erdi arasındaki fark nedir ...
Veverke

@Veverke "Set nesnesi ve düz nesne arasındaki fark nedir", sadece dokümanı okuyabilir ..
Hacketo

1
@Hacketo: API'sinde "Clear" sağlayan Set dışında bir şey buluyor musunuz?
15'te Veverke

1
Bu ilginç bir cevap - aldığından daha fazla kredi gerektirdiğini düşünün. Beni düşündürdü. Teşekkür ederim!
Thomas

2

Tanım gereği "Bir Küme, her bir değerin yalnızca bir kez olabileceği bir değerler topluluğudur." Dolayısıyla, dizinizde tekrarlanan değerler varsa, tekrarlanan değerler arasında yalnızca bir değer Kümenize eklenir.

var arr = [1, 2, 3];
var set = new Set(arr);
console.log(set); // {1,2,3}


var arr = [1, 2, 1];
var set = new Set(arr);
console.log(set); // {1,2}

Bu nedenle, dizinizde tekrarlanan değerler varsa kümeye dönüştürmeyin.

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.