Javascript - inititalValue trong reduce() có quan trọng không?
TIL
542
Javascript
215
@100daysTIL
66
White

Minh-Trung Nguyễn viết ngày 17/04/2018

Javascript - inititalValue trong reduce() có quan trọng không?

Day 41:

Đọc code mẫu về hàm reduce() trong MDN, thấy hàm reduce() khá "đơn giản".

const array1 = [1, 2, 3, 4];
const reducer = (accumulator, currentValue) => accumulator + currentValue;

// 1 + 2 + 3 + 4
console.log(array1.reduce(reducer)); // output: 10

console.log(array1.reduce(reducer, 5)); // output: 15

Số 5console.log() thứ 2 chính là initialValue, một tham số truyền vào cho reduce() nhưng không bắt buộc, chỉ là dạng "optional".

Yeap, nó "optional", nhưng nó có quan trọng không? Câu trả lời là . Và "có lẽ" là nên tạo thói quen thêm initialValue cho mọi lần sử dụng reduce().

Hãy xem đoạn code sau (cũng trong hướng dẫn của MDN), mục đích là để xóa các item bị trùng trong một array:

var data = [1, 2, 1, 2, 3, 5, 4, 5, 3, 4, 4, 4, 4];
var removeDuplicate = (finalItemList, currentItem) => {
    const length = finalItemList.length;
    if (length === 0 || finalItemList[length - 1] !== currentItem) {
        finalItemList.push(currentItem);
    } 
    return finalItemList;
}
var finalResult = data.sort().reduce(removeDuplicate);

Nhìn qua logic có vẻ ổn, ta không đưa vào initialValue cho reduce() vì chủ quan nghĩ nó không cần thiết. Nhưng khi chạy sẽ được báo lỗi finalItemList.push is not a function.

TẠI SAO? Tại nếu không truyền vàoinitialValue, thì trong vòng lặp đầu tiên,reduce() sẽ mặc định coi phần tử đầu tiên của array (tức là 1), là finalItemList. Mà 1 là kiểu Number, nó đâu có method push() như kiểu Array.

Do vậy, việc truyền vào initialValue bằng 1 mảng rỗng [ ] ở đây là bắt buộc. Đoạn code đó phải sửa thành:

var finalResult = data.sort().reduce(removeDuplicate, []);

Với những trường hợp khác cũng tương tự, khi ta phải làm việc lẫn lộn giữa object, array, string, number, thì nguy cơ gây lỗi kiểu trên là có.

Vậy tốt nhất là cứ truyền vào một initialValue ban đầu bằng 0, bằng '', bằng [], hoặc {} tùy tình huống. Rule of thumb là cho nó cùng kiểu với kiểu dữ liệu cuối cùng muốn nhận về.

ngminhtrung 16-04-2018

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Minh-Trung Nguyễn

50 bài viết.
39 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
27 5
Ghi chú: Tiêu đề hoàn toàn mang tính câu view. Bài copy từ blog của tác giả :) Tại sao lại có bài viết này? Một ngày đẹp giời tôi cần kiểm t...
Minh-Trung Nguyễn viết 4 tháng trước
27 5
White
26 3
Đăng lại một bài đã viết từ cách đây mấy tháng. Chủ đề này đã có không ít, nhưng chẳng hiểu sao lượng bài tự viết của dân lập trình người Việt ta v...
Minh-Trung Nguyễn viết 2 ngày trước
26 3
White
9 4
Day 38: Bài toán: Tự học ReactJS bằng cách làm onepage app đơn giản ((Link)), vấn đề mình đau đầu nhất là (1) lên layout, và (2) làm style cho a...
Minh-Trung Nguyễn viết 15 ngày trước
9 4
Bài viết liên quan
White
41 8
Tăng sức mạnh cho javascript với lodash Lần này mình sẽ giới thiệu 1 thư viện javascript vô cùng bá đạo có tên là "lodash]1]", có thể nói nó là LI...
Huy Hoàng Phạm viết hơn 2 năm trước
41 8
White
23 8
Lâu không post gì muốn viết một bài dài dài về js cơ mà đau đầu quá viết mãi không xong, thôi post bài ngắn vậy :smiley: Lấy screen size ở đây tôi...
Hoàng Duy viết hơn 2 năm trước
23 8
White
5 0
Có bao giờ bạn thắc mắc, chuyện gì thực sự diễn ra khi chúng ta gõ một địa chỉ trang web (ví dụ: (Link)) lên trình duyệt và nhấn Enter? Đầu tiên, t...
Lam Pham viết 3 tháng trước
5 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
50 bài viết.
39 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!