Code Tu Tam

Map và set trong javascript

Rate this post

Cho đến bây giờ, chúng ta đã tìm hiểu về các cấu trúc dữ liệu phức tạp sau:

Tuy nhiên trong ECMAScript 2015 giới thiệu 2 loại object mới:

Map

Map là một tập hợp các mục dữ liệu có key, giống như một Object. Nhưng sự khác biệt chính là Map cho phép các phím thuộc bất kỳ loại nào.

Các phương thức và thuộc tính là:

Ví dụ:

let map = new Map();

map.set('1', 'str1');   // key là string
map.set(1, 'num1');     //  key là number
map.set(true, 'bool1'); //  key là kiểu boolean

// object thông thường nó sẽ chuyển đổi các key thành chuỗi
// Map giữ nguyên kiểu, vì vậy hai thứ này khác nhau:
alert( map.get(1)); // 'num1'
alert( map.get('1')); // 'str1'

alert( map.size ); // 3

Map cũng có thể sử dụng các object làm key.

Ví dụ:

let name= { name: "Thái" };

let visitsCountMap = new Map();

visitsCountMap.set(name, 123);

alert( visitsCountMap.get(name) ); 
// Kết quả
123

Sử dụng các object làm key là một trong những tính năng đáng chú ý và quan trọng nhất Map. Điều tương tự không được tính cho Object. Dùng chuỗi làm key trong Object cũng được, nhưng chúng ta không thể sử dụng chuỗi khác Object làm key trong Object.

Ví dụ:

let john = { name: "John" };
let ben = { name: "Ben" };

let visitsCountObj = {}; // sử dụng một object

visitsCountObj[ben] = 234; // sử dụng đối tượng ben làm key
visitsCountObj[john] = 123; // sử dụng đối tượng john làm key, đối tượng ben sẽ được thay thế

alert( visitsCountObj["[object Object]"] ); // 123

Như visitsCountObj là một object , nó chuyển đổi tất cả Object key, chẳng hạn như john và ben ở ví dụ trên, thành cùng một chuỗi “[object Object]”. Chắc chắn không phải những gì chúng ta muốn.

Mỗi lệnh gọi map.set trả về chính map, vì vậy chúng tôi có thể “xâu chuỗi” các lệnh gọi:

map.set('1', 'str1')
  .set(1, 'num1')
  .set(true, 'bool1');

Vòng lặp trong map

Để lặp qua a map, có 3 phương pháp:

Ví dụ:

let recipeMap = new Map([
  ['cucumber', 500],
  ['tomatoes', 350],
  ['onion',    50]
]);

for (let vegetable of recipeMap.keys()) {
  alert(vegetable); // cucumber, tomatoes, onion
}

for (let amount of recipeMap.values()) {
  alert(amount); // 500, 350, 50
}

for (let entry of recipeMap) { // giống như cookMap.entries()
  alert(entry); 
  // cucumber,500
  // tomatoes,350
  // onion,50
}

Bên cạnh đó, Map có một phương thức forEach được tích hợp sẵn, tương tự như Array:

recipeMap.forEach( (value, key, map) => {
  alert(`${key}: ${value}`); // cucumber: 500 etc
});

Set

Các phương thức và thuộc tính là:

Đặc điểm chính là các lệnh gọi set.add (value) lặp đi lặp lại với cùng một giá trị sẽ không có tác dụng gì. Đó là lý do tại sao mỗi giá trị chỉ xuất hiện trong Tập hợp một lần.

Ví dụ:

let set = new Set();

let john = { name: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };

set.add(john);
set.add(pete);
set.add(mary);
set.add(john);
set.add(mary);

// set chỉ giữ các giá trị duy nhất
alert( set.size ); // 3

for (let user of set) {
  alert(user.name); // John (sau đó Pete và Mary)
}

Vòng lặp trong set

Chúng ta có thể lặp lại một tập hợp với for..of hoặc sử dụng forEach:

let set = new Set(["oranges", "apples", "bananas"]);

for (let value of set) alert(value);

// tương tự với forEach:
set.forEach((value, valueAgain, set) => {
  alert(value);
});

Các phương pháp tương tự của Map có cho các trình vòng lặp cũng được hỗ trợ:

 

 

 

 

Exit mobile version