- vừa được xem lúc

Xài find() hay xài Map, đâu mới là lựa chọn tốt nhất?

0 0 8

Người đăng: NGUYỄN ANH TUẤN

Theo Viblo Asia

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! 😊

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 518

- vừa được xem lúc

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 429

- vừa được xem lúc

Một số phương thức với object trong Javascript

Trong Javascript có hỗ trợ các loại dữ liệu cơ bản là giống với hầu hết những ngôn ngữ lập trình khác. Bài viết này mình sẽ giới thiệu về Object và một số phương thức thường dùng với nó.

0 0 147

- vừa được xem lúc

Tìm hiểu về thư viện axios

Giới thiệu. Axios là gì? Axios là một thư viện HTTP Client dựa trên Promise.

0 0 135

- vừa được xem lúc

Imports và Exports trong JavaScript ES6

. Giới thiệu. ES6 cung cấp cho chúng ta import (nhập), export (xuất) các functions, biến từ module này sang module khác và sử dụng nó trong các file khác.

0 0 105

- vừa được xem lúc

Bài toán đọc số thành chữ (phần 2) - Hoàn chỉnh chương trình dưới 100 dòng code

Tiếp tục bài viết còn dang dở ở phần trước Phân tích bài toán đọc số thành chữ (phần 1) - Phân tích đề và những mảnh ghép đầu tiên. Bạn nào chưa đọc thì có thể xem ở link trên trước nhé.

0 0 241