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 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 ); // 3Map 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ả
123Sử 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]"] ); // 123Như 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');Để 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
});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)
}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ợ:
Bình luận: