Array JavaScript untuk Diatur

161

MSDN mereferensikan abstraksi kumpulan Set JavaScript . Saya punya array objek yang ingin saya ubah menjadi satu set sehingga saya bisa menghapus ( .delete()) berbagai elemen dengan nama:

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

Bagaimana cara mengubah array ini menjadi satu set? Lebih khusus lagi, apakah mungkin melakukan ini tanpa melakukan iterasi pada larik di atas? Dokumentasinya relatif kurang (cukup untuk set yang dipakai; bukan untuk konversi - jika memungkinkan).

Saya mungkin juga berpikir tentang konversi ke a Peta , untuk dihapus dengan kunci. Apa yang saya coba capai adalah koleksi iterable yang dapat diakses atau dimodifikasi melalui akses elemen terutama melalui kunci (sebagai lawan indeks).

Konversi dari larik ke larik menjadi tujuan akhir.

Thomas
sumber
1
Kedengarannya seperti Object tua biasa akan bekerja untuk Anda ...
dandavis
3
@ Thomas: jadi saya melewatkan sesuatu, yang ingin saya pelajari. Apa perbedaan antara var s = new Set (), menambahkan objek dan menerbitkan s.delete (terserah) - dan var o = {1: 'aaa', 2: 'bbbb' ...} dan mengeluarkan delete (o [ '1'])?
Veverke
1
@Veverke yang lebih deskriptif daripada komentar awal Anda (+1). Terima kasih. Tetapi, sekali lagi, apakah mungkin untuk melakukan itu tanpa melakukan iterasi pada array untuk penambahan konten array ke objek dan untuk mempertahankan struktur seperti daftar yang dapat diakses oleh kunci? Sepertinya Anda punya ide. Saya tidak keberatan melihatnya dalam format jawaban jika Anda punya waktu untuk menjelaskannya.
Thomas
2
Objek array itu tidak legal, karena {"bob", "dole"}bukan objek yang valid.
Alnitak
1
@Veverke ES6 Setdan Mapmerupakan implementasi "murni" dari konstruksi data yang tidak mengalami masalah yang Objectdapat ditambahkan ke prototipe.
Alnitak

Jawaban:

231

Cukup berikan array ke konstruktor Set. Konstruktor Set menerima iterableparameter. Objek Array mengimplementasikan iterableprotokol, jadi itu adalah parameter yang valid.

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

Lihat disini

levi
sumber
benar, meskipun saya sendiri ragu-ragu untuk menambahkan jawaban karena format data OP salah dan oleh karena itu tidak jelas persis apa yang diharapkannya
Alnitak
10
Ini tidak berfungsi di IE11. Itu tidak mendukung konstruktor ini. Saya akan menghindarinya kecuali Anda tahu browser mana yang akan digunakan pengguna Anda.
Eric
15

Jika Anda memulai dengan:

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

Dan Anda menginginkan sekumpulan, katakanlah, nama, Anda akan melakukan:

let namesSet = new Set(array.map(item => item.name));
Ryan Shillington
sumber
3

Apa yang dikatakan levi tentang meneruskannya ke konstruktor benar, tetapi Anda juga bisa menggunakan objek.

Saya pikir apa yang Veverke coba katakan adalah Anda dapat dengan mudah menggunakan deletekata kunci pada suatu objek untuk mencapai efek yang sama.

Saya pikir Anda bingung dengan terminologi; properti adalah komponen dari objek yang dapat Anda gunakan sebagai indeks bernama (jika Anda ingin menganggapnya seperti itu).

Coba sesuatu seperti ini:

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

Kemudian, Anda bisa melakukan ini:

delete obj["bob"];

Struktur objeknya akan seperti ini:

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

Yang memiliki efek yang sama.

AstroCB
sumber
1
Terima kasih Astro :-). Memang, ini membuka pertanyaan: "apa perbedaan antara objek Set dan objek biasa"? Meskipun, seperti yang telah saya catat dalam komentar di atas, "Set" adalah jenis penutup yang menawarkan "fungsi bagus untuk memiliki fungsi" dari "jelas".
Veverke
Singkatnya, saya pikir judul posting harus diubah menjadi "Apa perbedaan antara objek Set dan objek biasa di javascript", dan perhatikan bahwa "Dalam mencoba mencapai ini dan itu ... saya akhirnya bertanya pada diri sendiri apa perbedaan antara ...
Veverke
@Veverke "apa perbedaan antara objek Set dan objek biasa", bisa langsung baca dok ..
Hacketo
1
@ Hacketo: apakah Anda menemukan selain Set yang menyediakan "Clear" di apinya?
Veverke
1
Ini adalah jawaban yang menarik - anggaplah itu menjamin lebih banyak kredit daripada yang diterimanya. Membuat saya berpikir. Terima kasih!
Thomas
2

Menurut definisi "Himpunan adalah kumpulan nilai, di mana setiap nilai hanya dapat muncul sekali." Jadi, jika array Anda memiliki nilai berulang, maka hanya satu nilai di antara nilai berulang yang akan ditambahkan ke Set Anda.

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}

Jadi, jangan convert to set jika Anda memiliki nilai berulang dalam array Anda.

Ashlesh Sortee
sumber