Koleksi dengan kunci

Anda bisa menggunakan Literal objek untuk menyimpan pasangan nilai kunci, dan Array untuk menyimpan kumpulan nilai yang bersifat iterable. ES6 juga memperkenalkan struktur data khusus agar sesuai dengan kasus penggunaan yang lebih terperinci: Peta untuk pasangan nilai kunci, dan Tetapkan untuk nilai-nilai individual.

Peta

{i>Map <i}adalah struktur data {i>iterable<i} yang menyimpan informasi sebagai pasangan nilai-kunci, mirip dengan literal Objek. Tidak seperti literal Objek, Peta memungkinkan kedua nilai dan kunci untuk memiliki jenis data apa pun, dan elemen urutan ditambahkan ke Peta adalah dipertahankan saat melakukan iterasi.

Untuk membuat Peta, gunakan konstruktor Map():

const myMap = new Map();

myMap;
> Map(0)

Anda dapat mengisi otomatis Peta dengan data menggunakan sintaksis yang menyerupai array (atau objek iterator apa pun) yang berisi objek seperti array yang terdiri dari dua elemen. Elemen pertama dalam setiap struktur data dua elemen menjadi kunci, sedangkan yang kedua menjadi nilai yang terkait dengan kunci tersebut. Bentuk paling sederhana dari ini adalah, secara efektif, {i>array<i} di di mana setiap elemen itu sendiri merupakan himpunan yang terdiri dari dua elemen, kunci dan nilai elemen yang akan ditambahkan ke Peta:

const myMap = new Map([
    [ "myKey", "A string value" ],
    [ "mySecondKey", 500 ],
    [ "myThirdKey", true ]
]);

myMap;
> Map(3) {'myKey' => 'A string value', 'mySecondKey' => 500, 'myThirdKey' => true}

Sekali lagi, objek Map berbeda dari literal objek karena nilai keduanya dan kunci dapat menggunakan jenis data dan nilai apa pun:

const notAFunction = () => console.log( "function" );
const myMap = new Map([
  [ null, 0 ],
  [ false, "This is false" ],
  [ undefined, "No defined value" ],
  [ NaN, "Not a number" ]
]);

myMap;
> Map(4) {null => 0, false => 'This is false', undefined => 'No defined value', NaN => 'Not a number'}

Untuk mendapatkan, menetapkan, atau menghapus elemen Peta, gunakan metode yang diwarisi dari Map konstruktor:

const myMap = new Map();

myMap;
> Map(0)

myMap.set( "myKey", "My value." );

myMap.has( "myKey" );
> true

myMap.get( "myKey" );
"My value."

myMap.delete( "myKey" );

myMap;
> Map(0)

Kunci di Peta bersifat unik, artinya menetapkan kunci yang identik akan menimpa pasangan nilai kunci yang disimpan sebelumnya:

const myMap = new Map([ [ "myKey", "A string value" ] ]);

myMap.set( "myKey", 500 );

myMap;
> Map(1) {'myKey' => 500}

Seperti objek, Anda dapat menetapkan Peta ke variabel yang dideklarasikan dengan const dan kemudian ubah Peta tersebut. Namun, seperti kasus penggunaan const lainnya, Anda tidak dapat mengubah atau menghapus variabel itu sendiri:

const myMap = new Map();
myMap.set( "myKey", "A string value" );

myMap;
> Map(1) {'myKey' => 500}

WeakMap

WeakMap adalah peta yang berisi "lemah" referensi, yang harus merujuk ke Object atau Symbols yang belum ditambahkan ke registry Symbol global.

Untuk membuat WeakMap, gunakan konstruktor WeakMap():

const myWeakMap = new WeakMap();

myWeakMap;
> WeakMap(0)

Sintaksis WeakMap mirip dengan Map, tetapi WeakMaps tidak iterable, dan mencoba menggunakan nilai apa pun selain objek atau simbol sebagai kunci akan menyebabkan kesalahan {i>syntax<i}. Jika tidak referensi terhadap kunci tersedia di luar WeakMap, objek atau simbol tersebut, dan nilai yang terkait dalam WeakMap, keduanya memenuhi syarat untuk pembersihan sampah memori.

Hal ini memungkinkan kasus penggunaan seperti menyimpan metadata yang terkait dengan objek di WeakMap, menggunakan referensi ke objek sebagai kunci. Jika tidak ada referensi lain ada untuk Objek ini, dan Objek itu dihapus dari memori, yang terkait metadata juga dihapus.

Setel

{i>Set<i} adalah kumpulan {i>iterable<i} dari nilai-nilai unik yang agak mirip dengan suatu himpunan (array), meskipun Set hanya dapat berisi nilai unik. Seperti halnya Peta, melakukan iterasi melalui Set mempertahankan elemen urutan yang ditambahkan ke dalamnya.

Untuk membuat Set, gunakan konstruktor Set():

const mySet = new Set();

mySet;
> Set []

Anda juga dapat membuat Set dari literal Array:

const mySet = new Set([ 1, 2, 3 ]);

mySet;
> Set(3) [ 1, 2, 3 ]

Karena Set tidak mengizinkan elemen duplikat, ketika Set dibuat dari array yang berisi beberapa instance dengan nilai yang sama, array ini hanya menyimpan dari nilai tersebut:

const mySet = new Set([ 1, 2, 3, 2 ]);

mySet;
> Set(3) [ 1, 2, 3 ]

Untuk menambahkan atau menghapus elemen dari Kumpulan, gunakan metode yang diwarisi dari Set . Metode ini bertindak pada elemen berdasarkan nilai elemen itu sendiri, alih-alih merujuk pada indeks:

const mySet = new Set();

mySet.add( "My value." );

mySet;
> Set [ "My value." ]

mySet.has( "My value." );
> true

mySet.delete( "My value." );

mySet;
> Set []

Meskipun bukan kumpulan yang diindeks, Kumpulan tidak dimaksudkan untuk digunakan sebagai sehingga, elemen dalam Kumpulan diiterasi sesuai urutan penyisipan. Upaya untuk menambahkan nilai elemen duplikat ke Set adalah dilewati, mempertahankan urutan penyisipan asli:

const mySet = new Set([ 1, 2, 3 ]);

mySet;
> Set(3) [ 1, 2, 3 ]

mySet.add( 2 );
> Set(3) [ 1, 2, 3 ]

Untuk membuat Array dari Kumpulan, gunakan metode Array.from() atau sebarkan sintaksis:

const mySet = new Set([ 1, 2, 3 ]);
const myArray = Array.from( mySet );

myArray;
> Array(3) [ 1, 2, 3 ]

[ ...mySet ];
> Array(3) [ 1, 2, 3 ]

WeakSet

WeakSet adalah kumpulan yang hanya berisi nilai yang dapat dikumpulkan dari sampah, seperti referensi ke Object, atau Symbols yang belum ditambahkan ke registry Symbol global.

Untuk membuat WeakSet, gunakan konstruktor WeakSet():

const myWeakSet = new WeakSet();

myWeakSet;
> WeakSet []

Sintaksis WeakSet mirip dengan Set, meskipun WeakSet tidak iterable, dan mencoba menambahkan nilai apa pun selain objek atau simbol akan menyebabkan kesalahan {i>syntax<i}. Seperti halnya WeakMap, jika tidak ada referensi lain untuk ada nilai yang direferensikan oleh WeakSet, nilai tersebut memenuhi syarat untuk pembersihan sampah memori.

Hal ini memungkinkan kasus penggunaan seperti menggabungkan satu kumpulan obyek terkait. Jika tidak ada referensi lain untuk Objek yang direferensikan oleh WeakSet, elemen terkait juga dihapus dari WeakSet.

Menguji pemahaman Anda

Dengan pertimbangan berikut:

        const myMap = new Map([ [ "myKey", "My string" ] ]);
        myMap.set( "myKey", 100 );
      

Apa yang ditampilkan myMap?

100
"My string"
undefined