Khám phá các cấu trúc dữ liệu mạnh mẽ trong JavaScript
← Quay lại trang chínhIterables là các đối tượng có thể được duyệt qua (iterated over) bằng for...of loop. Các iterables phổ biến trong JavaScript bao gồm:
Object KHÔNG phải là iterable! Bạn không thể sử dụng for...of với Object thông thường. Object cần được chuyển đổi trước khi có thể duyệt qua.
Object KHÔNG phải là iterable! Bạn không thể duyệt qua Object bằng for...of loop. Thay vào đó, sử dụng for...in hoặc Object.keys(), Object.values(), Object.entries().
sizefor...in, Object.keys(), Object.values(), Object.entries()sizefor...of, forEach()sizefor...of, forEach()
// Duyệt qua string
const name = "JavaScript";
for (let char of name) {
console.log(char); // J, a, v, a, S, c, r, i, p, t
}
// Duyệt qua array
const fruits = ["apple", "banana", "orange"];
for (let fruit of fruits) {
console.log(fruit); // apple, banana, orange
}
// Duyệt qua Set (tập hợp các giá trị duy nhất)
const uniqueNumbers = new Set([1, 2, 2, 3, 3, 4]); // Tự động loại bỏ duplicate
console.log(uniqueNumbers); // Set(4) {1, 2, 3, 4}
for (let number of uniqueNumbers) {
console.log(number); // 1, 2, 3, 4
}
// Duyệt qua Map (key-value pairs)
const studentGrades = new Map([
["Alice", 95],
["Bob", 87],
["Charlie", 92]
]);
for (let [student, grade] of studentGrades) {
console.log(`${student}: ${grade} điểm`);
// Alice: 95 điểm
// Bob: 87 điểm
// Charlie: 92 điểm
}
// ❌ Object KHÔNG phải iterable - KHÔNG thể dùng for...of
const student = { name: "John", age: 20, grade: 85 };
// ❌ Cách này SẼ BỊ LỖI!
// for (let item of student) { // TypeError: student is not iterable
// console.log(item);
// }
// ✅ Cách đúng để duyệt qua Object:
// 1. Dùng for...in để duyệt qua keys
for (let key in student) {
console.log(`${key}: ${student[key]}`);
}
// 2. Dùng Object.entries() để tạo iterable rồi dùng for...of
for (let [key, value] of Object.entries(student)) {
console.log(`${key}: ${value}`);
}
// 3. Dùng Object.keys() và Object.values()
for (let key of Object.keys(student)) {
console.log(`Key: ${key}`);
}
for (let value of Object.values(student)) {
console.log(`Value: ${value}`);
}
// Kiểm tra xem đối tượng có iterable không
function isIterable(obj) {
return obj != null && typeof obj[Symbol.iterator] === 'function';
}
console.log(isIterable("Hello")); // true
console.log(isIterable([1, 2, 3])); // true
console.log(isIterable(uniqueNumbers)); // true (Set)
console.log(isIterable(studentGrades)); // true (Map)
console.log(isIterable(student)); // false (Object)
console.log(isIterable(123)); // false
const obj = {name: "Long", age: 25, city: "HCM"};
// ❌ SAI - Object không iterable
// for (let item of obj) { ... } // TypeError!
// ✅ ĐÚNG - Các cách duyệt qua Object:
// 1. Duyệt qua keys
for (let key in obj) {
console.log(key, obj[key]);
}
// 2. Dùng Object.keys()
for (let key of Object.keys(obj)) {
console.log(key, obj[key]);
}
// 3. Dùng Object.entries()
for (let [key, value] of Object.entries(obj)) {
console.log(key, value);
}
Set là một collection chứa các giá trị duy nhất (unique values). Mỗi giá trị chỉ có thể xuất hiện một lần trong Set:
// Tạo Set mới
const mySet = new Set();
// Thêm giá trị vào Set
mySet.add(1);
mySet.add(2);
mySet.add(2); // Không được thêm vì đã tồn tại
mySet.add("hello");
console.log(mySet); // Set(3) {1, 2, "hello"}
console.log(mySet.size); // 3
// Tạo Set từ array (loại bỏ duplicate)
const numbers = [1, 2, 2, 3, 3, 4, 5];
const uniqueNumbers = new Set(numbers);
console.log(uniqueNumbers); // Set(5) {1, 2, 3, 4, 5}
// Chuyển Set về array
const uniqueArray = [...uniqueNumbers];
console.log(uniqueArray); // [1, 2, 3, 4, 5]
Set cung cấp nhiều methods hữu ích để thao tác với dữ liệu:
const fruits = new Set(["apple", "banana", "orange"]);
// Kiểm tra size
console.log(fruits.size); // 3
// Thêm giá trị
fruits.add("grape");
console.log(fruits); // Set(4) {"apple", "banana", "orange", "grape"}
// Kiểm tra tồn tại
console.log(fruits.has("apple")); // true
console.log(fruits.has("mango")); // false
// Xóa giá trị
fruits.delete("banana");
console.log(fruits); // Set(3) {"apple", "orange", "grape"}
// Duyệt qua Set
fruits.forEach(fruit => {
console.log(`Tôi thích ${fruit}`);
});
// Sử dụng for...of
for (let fruit of fruits) {
console.log(fruit);
}
Map là một collection lưu trữ các cặp key-value. Khác với Object, Map có thể sử dụng bất kỳ kiểu dữ liệu nào làm key:
// Tạo Map mới
const myMap = new Map();
// Thêm cặp key-value
myMap.set("name", "John");
myMap.set("age", 30);
myMap.set(1, "number key");
myMap.set(true, "boolean key");
console.log(myMap); // Map(4) {"name" => "John", "age" => 30, 1 => "number key", true => "boolean key"}
// Tạo Map từ array
const userMap = new Map([
["id", 1],
["username", "john_doe"],
["email", "john@example.com"]
]);
console.log(userMap.get("username")); // "john_doe"
console.log(userMap.size); // 3
// So sánh Map vs Object
const obj = { name: "Alice", age: 25 };
const map = new Map([["name", "Alice"], ["age", 25]]);
console.log(Object.keys(obj).length); // 2
console.log(map.size); // 2
Map cung cấp nhiều methods mạnh mẽ để thao tác với dữ liệu:
const studentGrades = new Map();
// Thêm điểm cho học sinh
studentGrades.set("Alice", 95);
studentGrades.set("Bob", 87);
studentGrades.set("Charlie", 92);
console.log(studentGrades.size); // 3
// Lấy điểm của học sinh
console.log(studentGrades.get("Alice")); // 95
console.log(studentGrades.get("David")); // undefined
// Kiểm tra học sinh có tồn tại không
console.log(studentGrades.has("Bob")); // true
// Cập nhật điểm
studentGrades.set("Bob", 90);
console.log(studentGrades.get("Bob")); // 90
// Duyệt qua Map
for (let [name, grade] of studentGrades) {
console.log(`${name}: ${grade} điểm`);
}
// Sử dụng forEach
studentGrades.forEach((grade, name) => {
console.log(`${name} đạt ${grade} điểm`);
});
// Lấy tất cả keys và values
console.log([...studentGrades.keys()]); // ["Alice", "Bob", "Charlie"]
console.log([...studentGrades.values()]); // [95, 90, 92]
Áp dụng kiến thức về Iterables, Sets và Maps vào các bài tập thực tế
Tạo một ứng dụng quản lý danh sách các mục không trùng lặp sử dụng Set.
Sử dụng Map để quản lý điểm số của các học sinh.
Sử dụng Map để đếm số lần xuất hiện của mỗi ký tự trong một đoạn text.
Tạo giỏ hàng sử dụng Map để lưu sản phẩm và số lượng.