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 ); // 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');
Để 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: