Vòng lặp (loop) là thứ cơ bản nhất trong lập trình, và cũng là thứ thường xuyên được các developer sử dụng. Bên cạnh đó cũng tồn tại những function build sẵn hỗ trợ việc loop trở nên vui hơn. Ý mình là các function kiểu kiểu cao cấp như map, filter, reduce, … đấy.
Về cơ bản các function này đều liên quan tới khái niệm callback trong js, nên các bạn cần tìm hiểu callback trước khi sử dụng các function này nhé. À thêm nữa, để bắt kịp xu hướng mình sẽ đưa ví dụ sử dụng arrow function (gọi là lambda function cũng được).
Loop mảng và chỉnh sửa item nhận về mảng mới
Viết loop thường
1 | var students = ['Mai', 'Cúc', 'Phượng', 'Hồng', 'Huệ', 'Đào']; |
Giải pháp sử dụng map:
1 | var students = ['Mai', 'Cúc', 'Phượng', 'Hồng', 'Huệ', 'Đào']; |
Map sẽ trả về một mảng mới, mỗi giá trị trong mảng mới này được return từ callback truyền vào map. Khi sử dụng map thì không dùng continue hay break được, có thể xài reduce để khắc chế được điều này. À nếu bạn không return về thì undefined sẽ được return về.
Loop mảng và gọi function nào đó
Viết loop thường
1 | function showNameStudent(student) { |
Dùng forEach
1 | function showNameStudent(student) { |
Dùng map ở case này vẫn được, nhưng map sẽ trả về mảng, mà chúng ta chỉ cần loop rồi gọi hàm thôi, thì forEach là chuẩn nhất.
Chọn lọc, lọc phần tử trong mảng
Giả sử mình có mảng students và mình chỉ muốn lấy student nào có tuổi trên 20 mà thôi.
Viết loop thường
1 | var students = [ |
Dùng filter gọn gàng
1 | var students = [ |
Dùng reduce, cách hoạt động của reduce bạn tham khảo ở đây
1 | var students = [ |
Vậy khi nào cần sử dụng reduce, xài khi nào chuẩn xác nhất, cá nhân mình nghĩ khi bạn cần cộng dồn hoặc giá trị trong một mảng, hoặc dồn những giá trị có một điểm chung nào đó vào một mảng riêng.
Giả sử hôm nay bạn bán hàng, mỗi lần bán bạn thu về được số tiền là numbers. Đến cuối ngày bạn muốn tính tổng xem mình đã bán được bao nhiêu tiền.
1 | var numbers = [123, 43, 734, 347, 445, 23, 345, 54, 65]; |
Như đã nói, tham khảo cách `reduce` hoạt động để hiểu hơn.
Kiểm tra xem trong mảng có chứa phần tử này không?
Viết loop thường
1 | var students = ['Mai', 'Cúc', 'Phượng', 'Hồng', 'Huệ', 'Đào']; |
Dùng some
1 | var students = ['Mai', 'Cúc', 'Phượng', 'Hồng', 'Huệ', 'Đào']; |
Vậy nếu mảng object thì như thế nào.
1 | var students = [ |
Hàm some sẽ chạy duyệt mảng tìm nếu thỏa điều kiện thì return true, không có thì false. À nếu mảng không có phần tử nào (empty array) thì auto return về false.
Ngoài ra có thể sử dụng includes hoặc indexOf để thay thế.
Duyệt hết mảng
Cũng tương tự .some() nhưng every() có vài điểm khác biệt, every sẽ duyệt hết mảng bất kể là đã tìm thấy điều kiện. Và nếu mảng là mảng rỗng thì mặc định sẽ return true.
Tóm lại
Về cơ bản chúng cũng đều loop, và chúng giúp bạn lập trình vui hơn, khỏe hơn ở vài trường hợp và chúng không dùng để thay thế loop truyền thống. Có vài đều bạn cần lưu ý khi dùng các function này.
- Tốc độ thực thi sẽ chậm hơn loop truyền thống nên mảng gặp mảng lớn thì hơi xanh mặt.
- Nếu cần dùng async/await thì sẽ phức tạp hơn, không như loop thường.
- Nếu không tìm hiểu kỹ, hoặc dùng không đúng cách sẽ gây lãng phí, ví dụ xài
maphoặceveryđể check xem có phần tử nào hay không,mapchạy hết mảng, và lúc tìm thấy bạn không thểbreakđể stop lại được. - Nếu callback truyền vào những function này là function thường (ở các ví dụ trên mình xài arrow function) thì
thisbinding vào cũng khác so vớithisgọi trong loop thường.
À for of cũng là cách để duyệt mảng vui hơn nhiều đây, không riêng chi mấy function này đâu.
Mình thấy một repo trên github có nói về về giải pháp thay thế loop, các bạn xem thử: You don’t (may not) need loops
Cuối cùng sẽ có kha khá người bảo không nên xài cái này cái kia các kiểu. Ý mình không giống thế, hãy nghiên cứu và chọn ra cái mình cần và phù hợp nhất.
Chúc vui với coding.