Segala sesuatu tentang struktur data kumpulan di JavaScript.

Ada banyak situasi di mana Anda perlu membandingkan beberapa daftar dan mengekstrak item yang dimiliki atau tidak sama, hanya tersedia dalam satu daftar, dll. Set memungkinkan Anda melakukan hal itu dan banyak lagi. Secara khusus, Kumpulan Javascript adalah kumpulan yang sangat istimewa dan kuat tetapi masih kekurangan hal-hal penting yang ditawarkan bahasa lain.

Versi Video Artikel Ini

Posting ini adalah versi artikel yang lebih baik dan lebih detail dari Set Seri Struktur Data di Youtube yang dapat Anda periksa apakah Anda lebih suka video.

Tonton Video

Apa itu Set?

Set adalah kumpulan item unik yang disimpan tanpa urutan tertentu. Tidak seperti tipe koleksi lain seperti Stack, Queue, dan Array, Set digunakan dalam perbandingan daftar dan untuk menguji apakah suatu item ada dalam satu set atau tidak. Benar jika dikatakan bahwa suatu Set menyimpan pasangan nilai kunci-kunci karena Anda menggunakan item tersebut untuk menguji apakah item tersebut ada dalam set tersebut.

Set juga merupakan tipe data abstrak yang artinya ditentukan oleh perilakunya seperti Struktur Data “Stack” dan “Queue”. Karena sifat kunci-kuncinya, suatu Set sangat terkait erat dengan Peta dibandingkan apa pun dan Anda bahkan dapat mengimplementasikan suatu Set dengan menggunakannya.

Kumpulan Javascript

Kumpulan Javascript sangat mendasar dan sederhana. Ia tidak memiliki kemampuan operasi set umum yang biasanya ditawarkan oleh bahasa lain. Ini juga menggunakan algoritma unik untuk menguji apakah item sama dibandingkan dengan pemeriksaan ketat triple sama dengan (===).

Artinya, menyimpan “tidak terdefinisi”, “null” dan “NaN” dalam kumpulan akan menjamin bahwa keduanya hanya ada satu kali meskipun “Nan ! == Tidak”. Keunggulannya adalah dalam menyimpan tipe objek yang sulit untuk diperiksa kesetaraannya.

const set = new Set([null, undefined, null, NaN, NaN, null]);
console.log([...set]); // [null, undefined, NaN]

Anda menyisipkan dengan ""tambahkan"" dan menghapus dengan ""hapus"" untuk satu item atau seluruh rangkaian dengan ""hapus»” metode. Ini adalah Iterable dan dilengkapi dengan iterator untuk "nilai" dan "entri" karena kunci dan nilainya sama. Oleh karena itu fakta bahwa ini sering digambarkan sebagai kumpulan pasangan nilai kunci-kunci. Ini juga memperlihatkan metode “forEach»” seperti Array dan Map sebagai cara yang lebih cepat untuk mengulangi item-itemnya.

const set = new Set([78, 20, 44]);
set.add(12);
set.delete(78);
set.clear();

Seperti disebutkan sebelumnya, Set digunakan untuk membuat perbandingan dan pemeriksaan item tetapi satu-satunya metode yang memungkinkan Anda memeriksa sesuatu adalah metode “memiliki»” yang jika diberikan suatu item, maka akan mengembalikan nilai benar atau salah apakah di set atau tidak.

set.has(12); // true
set.has(21); // false

Untuk melakukan pemeriksaan yang lebih kompleks, Anda harus menambahkan metode baru yang memungkinkan Anda membuat perbandingan yang kuat dan bekerja dengan data daftar dengan baik yang akan saya tunjukkan nanti.

Himpunan vs Larik

Set sangat berbeda dengan Array dan alasan keduanya sering dibandingkan satu sama lain dalam Javascript adalah karena Array sering digunakan untuk melakukan hal-hal yang dilakukan Set.

Array menyimpan item dalam urutan indeks dan memungkinkan pembacaan dan penulisan item dengan cepat selama Anda mengetahui indeksnya. Set memungkinkan hal yang sama selama Anda memiliki item tersebut. Ini menunjukkan bahwa Array adalah kumpulan item berbasis indeks dan Set adalah kumpulan item berbasis kunci.

Array dimaksudkan untuk digunakan ketika Anda ingin menyimpan item dalam urutan tertentu untuk akses dan manipulasi. Dalam suatu Set, item bersifat unik tetapi dapat berulang di dalam Array. Set sering digunakan untuk menghapus pengulangan item array tetapi tidak dimaksudkan untuk digunakan untuk tujuan Array.

const array = [23, 41, 12, 41, 67, 23];
const noRepeatArray = Array.from(new Set(array));
// becomes [23, 41, 12, 67]

learn more about Array

Set tidak dan tidak dimaksudkan sebagai pengganti Array. Ini hanya mengatasi masalah perbandingan daftar dan pemeriksaan item yang sangat spesifik yang tidak cocok untuk Array tanpa kode tambahan yang ekstensif untuk penanganannya.

const array = [12, 45];
const set = new Set([12, 45]);
// extra code needed to ensure uniqueness
if(!array.includes(12)) {
 array.push(12);
}
// does nothing since it already exists
set.add(12);
// slower: checks every item if necessary
array.includes(45); 
// faster: since it checks the key
set.has(45);

Kapan menggunakan Set?

Anda menggunakan Set ketika yang Anda inginkan hanyalah melakukan perbandingan dan memeriksa daftar tertentu. Katakanlah Anda memiliki daftar A dan B dan ingin mengetahui apakah keduanya sama. Daftar A apa yang tidak dimiliki B atau item apa yang sama-sama mereka miliki? Selain itu, item Set bersifat unik dan merupakan properti yang sangat baik untuk dieksploitasi.

Anda menggunakannya untuk menyimpan daftar item unik untuk diulangi nanti dan melakukan berbagai hal sehingga Anda tidak perlu khawatir daftar tersebut memiliki item yang berulang. Anda menggunakannya sehingga ketika Anda memiliki daftar sampel lain, Anda dapat mengetahui perbedaan atau kecocokannya satu sama lain untuk membuat keputusan tertentu. Anda menggunakannya sehingga nanti Anda dapat mengubahnya menjadi Array untuk melakukan lebih banyak operasi mirip array dan sebaliknya.

Tetapkan Operasi

Dalam matematika, setiap kali Anda berbicara tentang himpunan, ada operasi yang dapat Anda lakukan. Faktanya, Himpunan adalah implementasi komputer dari himpunan berhingga matematika.

Untuk menampilkan operasi Set dalam kode dengan benar, biarkan Set Javascript mewarisi properti dan metodenya serta memberinya metode kebutuhan tambahan. Untuk kode di bawah ini kita hanya memerlukan satu metode yang memeriksa apakah ada set yang valid. Untuk contoh ini, himpunan yang valid harus merupakan turunan dari objek Set dan tidak boleh kosong.

class SetExtended extends Set {
  #isValidSet = (set) => {    
    return set && set instanceof Set && set.size > 0;  
  };
}
  • Union:
    Operasi gabungan menggabungkan beberapa Set dan mengembalikan hasil penggabungan. Untuk implementasi kode di bawah ini, kami mengembalikan himpunan baru dengan menyebarkan himpunan saat ini dan himpunan tertentu dalam array untuk membuatnya.

union(set) {
  if (!this.#isValidSet(set)) return new SetExtended();
  return new SetExtended([...this, ...set]);
}
  • Persimpangan:
    Operasi intersepsi memberi kita himpunan baru yang hanya berisi item-item yang memiliki kesamaan. Contoh di bawah ini membahas himpunan yang lebih kecil (menghindari pemeriksaan yang tidak perlu) dan memeriksa apakah item tersebut ada di himpunan yang lebih besar dan menambahkannya ke himpunan persimpangan lalu mengembalikannya di akhir.

intersection(set) {
  const intersectionSet = new SetExtended();
  if (!this.#isValidSet(set)) return intersectionSet;
  const [smallerSet, biggerSet] = set.size <= this.size 
       ? [set, this] 
       : [this, set];
  smallerSet.forEach((item) => {
    if (biggerSet.has(item)) intersectionSet.add(item);
  });
  return intersectionSet;
}
  • Perbedaan:
    Operasi perbedaan mengembalikan himpunan baru yang hanya berisi item yang tidak memiliki kesamaan dengan himpunan lainnya. Ini juga dikenal sebagai Pengurangan. Implementasi di bawah ini menelusuri himpunan saat ini dan mengumpulkan item yang tidak ada di himpunan lain ke dalam himpunan perbedaan.

difference(set) {
  if (!this.#isValidSet(set)) return new SetExtended();
  const differenceSet = new SetExtended();
  this.forEach((item) => {
    if (!set.has(item)) differenceSet.add(item);
  });
  return differenceSet;
}
  • Selisih Persimpangan:
    Operasi selisih perpotongan adalah kebalikan dari perpotongan. Ini juga dikenal sebagai Eksklusif Atau. Ini mengembalikan set baru yang berisi semua item yang keduanya tidak memiliki kesamaan dan dalam implementasi di bawah ini, kami cukup membuat set baru dengan perbedaannya.

intersectionDifference(set) {
  if (!this.#isValidSet(set)) return new SetExtended();
  return new SetExtended([
    ...this.difference(set),
    ...set.difference(this),
  ]);
}
  • Subset:
    Suatu himpunan dikatakan himpunan bagian jika semua itemnya ditampung oleh himpunan lain. Implementasi di bawah ini memeriksa ukuran terlebih dahulu karena suatu himpunan tidak dapat menjadi bagian dari himpunan lain jika lebih besar dan kemudian untuk setiap item, ia memeriksa apakah ada di himpunan lainnya.

isSubsetOf(set) {
  if (!this.#isValidSet(set)) return false;
  return this.size <= set.size && 
     [...this].every(item => set.has(item))
}
  • Superset:
    Superset adalah kebalikan dari subset. Suatu himpunan disebut superset jika himpunan tersebut memuat semua item dari himpunan lain yang ukurannya lebih kecil atau sama.

isSupersetOf(set) {
  if (!this.#isValidSet(set)) return false;
  return this.size >= set.size && 
    [...set].every(item => this.has(item))
}

Anda tidak dibatasi pada operasi ini dan bebas untuk memasukkan lebih banyak hal yang dapat menyelesaikan jenis kebutuhan yang mungkin Anda miliki. Secara umum, pemeriksaan ini sangat mudah diterapkan dan Anda selalu dapat memanfaatkan fakta bahwa Set dan Array dapat dikonversi bolak-balik untuk memanfaatkan metode array yang kuat.

Kode Sumber: Periksa kode lengkap di Github ini

Himpunan Statis

Himpunan statis adalah himpunan yang selalu berisi item yang diinisialisasi dengannya. Anda tidak dapat menambah, menghapus, atau menghapus itemnya. Kumpulan Javascript tidak statis dan akan selalu menampilkan metode yang mengubah kumpulan setelah pembuatannya. Untuk mendapatkan himpunan statis kita harus mengganti perilaku ini dengan cara yang sama seperti kita memperluasnya.

Cara termudah adalah dengan memperluasnya dan mengganti metode yang memodifikasinya. Dengan begitu, Anda tidak bisa mengubahnya nanti.

class StaticSet extends SetExtended {
  constructor(items) {
    super(items);
    
    this.add = undefined;
    this.delete = undefined;
    this.clear = undefined;
  }
}

Kesimpulan

Secara umum, jika Anda sering memeriksa keberadaan item dalam daftar dan memfilter item untuk bagian tertentu dari daftar, itu adalah tanda yang jelas Anda harus menjelajahi Set. Kumpulan Javascript sangat kuat dan mudah digunakan dan mungkin sangat diremehkan.

Periksa Sebelum blog Titik Koma untuk artikel Struktur Data lainnya seperti ini. Juga, periksa Artikel struktur data array untuk lebih jelasnya.

Saluran YouTube: Sebelum Titik Koma
Situs Web: beforesemicolon.com

Konten lainnya di plainenglish.io