Bạn là Dev JavaScript? Chắc hẳn bạn cũng đã từng xài cái phương thức find()
rồi đúng không nào? Nhưng mà bạn có biết là nó chạy chậm như rùa không? 🐢
Thế này nhé, find()
nó tìm kiếm từng phần tử một trong mảng cho đến khi gặp cái nó cần. Tệ nhất là khi thằng cần tìm nó nằm tận cuối, thì phải lục tung cả đám lên, mất thời gian kinh khủng, độ phức tạp O(n) luôn. Mệt! 😩 Ví dụ nhé, giả sử bạn có một mảng các con số từ 1 đến 1 triệu, mà bạn muốn tìm xem số 999,999 có trong đó không. Nếu dùng find()
, nó phải duyệt qua từng phần tử một, từ đầu đến cuối mảng. Trời ơi, mất cả buổi luôn! 😫
Nhưng mà đừng lo, anh em mình có giải pháp ngon lành cành đào hơn nhiều. Đó chính là hash map, một kiểu lưu trữ cực kỳ nhanh. Nó như kiểu từ điển ấy, tra cái key là ra value liền. Thêm, xóa cũng nhanh như điện xẹt. Tất tần tật chỉ tốn O(1), ngon ơ phải không nào? 😎 Cứ tưởng tượng hash map như cuốn từ điển tiếng Anh ấy. Muốn tra nghĩa của một từ, chỉ cần mở ra trang có từ đó, chứ có cần phải lật giở từng trang đâu. Nhanh gọn lẹ, đúng không nào? 😄
Trong JavaScript thì có sẵn Map
rồi, xài cái này đi bạn. Nó linh hoạt cực, key muốn là gì cũng được, không như mảng chỉ xài số thôi. Xử lý mấy cái dữ liệu phức tạp hay cần tìm kiếm nhanh là Map
xử đẹp luôn. 💪 Ví dụ nè, giả sử bạn có một đống thông tin sinh viên, mỗi sinh viên có ID riêng. Bạn muốn lưu trữ và truy xuất thông tin dựa theo ID. Nếu dùng mảng, mỗi lần tìm kiếm lại phải duyệt qua cả đám, mệt lắm. Nhưng với Map
, cứ cho ID vào làm key, thông tin vào làm value, thế là xong. Lần sau muốn lấy thông tin của sinh viên nào, cứ get() ra là có liền. 😉
Chuyển dữ liệu sang Map
cũng dễ ợt. Lướt qua 1 lượt, nhớ là key phải unique nha. Xong xuôi rồi thì cứ get()
mà lấy, O(1) tất. Kiểm tra xem data có tồn tại không thì has()
một phát, cũng O(1) luôn, đỡ phải dùng includes()
chạy O(n). 😄 Ví dụ nha, có một mảng các object chứa thông tin sách, mỗi cuốn có một mã số ISBN duy nhất. Bạn muốn chuyển sang Map
để truy xuất nhanh hơn. Cứ thế này là được:
const books = [ { isbn: "978-1-56619-909-4", title: "Đắc Nhân Tâm" }, { isbn: "978-0-7334-2609-4", title: "Nhà Giả Kim" }, { isbn: "978-0-14-103940-8", title: "Hoàng tử bé" }
]; const bookMap = new Map(books.map(book => [book.isbn, book]));
Vậy là xong, giờ muốn tìm sách nào, cứ lấy ISBN ra get()
là có liền:
const myBook = bookMap.get("978-0-14-103940-8");
console.log(myBook.title); // "Hoàng tử bé"
Nhanh gọn lẹ phải không nào? 😄
Nói tóm lại, Map
đúng là "đỉnh của chóp" so với mảng và find()
khi xử lý với truy xuất data, nhất là với mấy bộ dữ liệu bự chà bá. Tìm kiếm cực nhanh, luôn luôn O(1), thích không nào? 😉 Nó giống như bạn có một cuốn sổ tay ghi chép đầy đủ, muốn tìm gì cứ lật ra trang đó là có, khỏi cần phải dò từng trang một. Tiện lợi cực kỳ luôn ấy chứ! 😎
Nhưng mà khoan đã, cái gì cũng có mặt trái của nó, Map
cũng vậy. Đúng là nó nhanh thật, nhưng trong một số trường hợp, nó lại gây phiền toái hoặc thậm chí còn chậm hơn cả find()
nữa cơ. 😅
Ví dụ nè, giả sử bạn có một mảng các số nguyên, và bạn muốn tìm số lớn nhất trong đó. Nếu dùng find()
, bạn chỉ cần duyệt qua mảng một lần và so sánh từng phần tử, cuối cùng sẽ ra được số lớn nhất. Nhưng nếu dùng Map
, bạn phải tạo một Map
mới, rồi duyệt qua mảng để đưa các phần tử vào Map
, cuối cùng mới lấy ra được số lớn nhất. Rõ ràng là phức tạp và tốn thời gian hơn nhiều so với find()
rồi. 😓
Hay là trường hợp bạn muốn tìm tất cả các phần tử thỏa mãn một điều kiện nào đó trong mảng. Với find()
, bạn chỉ cần lọc mảng theo điều kiện là ra. Nhưng với Map
, bạn lại phải tạo một Map
mới, rồi duyệt qua Map
để tìm các phần tử thỏa mãn, cuối cùng mới ra được kết quả. Lại mất công, mất thời gian hơn find()
rồi. 😞
Nên là, tùy vào từng trường hợp cụ thể mà bạn nên cân nhắc sử dụng Map
hay find()
cho phù hợp. Không phải lúc nào Map
cũng là lựa chọn tối ưu đâu nha. 😉
Dù sao thì Map
vẫn là một công cụ rất mạnh mẽ và hữu ích trong lập trình, đặc biệt là khi làm việc với các cặp key-value. Nhưng đừng lạm dụng quá, kẻo lại phản tác dụng nha. 😄 Thường mình luôn lựa chọn Map khi có một logic sử dụng lại mạng đó nhiều lần thì mình sẽ tạo 1 Map và sau đó là vèo vèo vèo.
Hy vọng bài viết này giúp bạn hiểu thêm về sức mạnh cũng như điểm yếu của Map
, và biết cách tận dụng nó sao cho hiệu quả nhé. Nếu thấy hay thì đừng quên chia sẻ cho anh em cùng biết nha. Chúc mọi người một ngày vui vẻ, ahihi! 😊