Map và set trong javascript

24/08/2022 - lượt xem
Chia sẻ
 
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:

  • Objects được sử dụng để lưu trữ key/value.
  • Arrays được sử dụng để lưu trữ các danh sách chỉ mục.

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

  • Map được sắp xếp theo các cặp key/value
  • Set là một tập hợp kiểu đặc biệt –  “tập hợp các giá trị” (không có key), trong đó mỗi giá trị chỉ xuất hiện 1 lần.

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à:

  • new Map() – tạo map.
  • map.set(key, value) – lưu trữ giá trị bằng key.
  • map.get(key) – trả về giá trị bằng key, undefined nếu key không tồn tại trong map.
  • map.has(key) – trả về true nếu key tồn tại, false ngược lại.
  • map.delete(key) – loại bỏ giá trị bằng key.
  • map.clear() – xóa mọi thứ khỏi map.
  • map.size – trả về số phần tử hiện tại.

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:

  • map.keys() – trả về có thể lặp lại cho các khóa,
  • map.values() – trả về một giá trị có thể lặp lại,
  • map.entries() – trả về một giá trị có thể lặp lại cho các mục nhập [key, value], nó được sử dụng theo mặc định trong for..of.

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à:

  • new Set (iterable) – tạo tập hợp và nếu một đối tượng có thể lặp lại được cung cấp (thường là một mảng), hãy sao chép các giá trị từ nó vào tập hợp.
  • set.add (value) – thêm một giá trị, trả về tập tin chính đó.
  • set.delete (value) – loại bỏ giá trị, trả về true nếu value tồn tại điểm gọi, nếu không false.
  • set.has (value) – trả về true nếu giá trị tồn tại trong tập tin, ngược lại false.
  • set.clear() – xóa mọi thứ từ tập tin.
  • set.size – là số phần tử.

Đặ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ợ:

  • set.keys() – trả về một đối tượng có thể lặp lại cho các giá trị,
  • set.values() – giống như set.keys(), để tương thích với Map,
  • set.entries() – trả về một đối tượng có thể lặp lại cho các mục [value, value], tồn tại để tương thích với Map.

 

 

 

 

    Liên hệ với chúng tôi

    Để lại thông tin để nhận được các bài viết khác

    Rate this post

    Xem thêm nhiều bài tin mới nhất về Kiến thức

    Xem thêm