Javascript - inititalValue trong reduce() có quan trọng không?
TIL
608
Javascript
251
@100daysTIL
72
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

58 bài viết.
74 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
44 15
Đă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 4 tháng trước
44 15
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 8 tháng trước
27 5
White
16 4
Về bước tìm và xử lý dữ liệu của Việt Nam phục vụ Data Visualization nền web Làm việc với D3js được nửa năm, một trong những điều bận lòng là chưa...
Minh-Trung Nguyễn viết 3 tháng trước
16 4
Bài viết liên quan
White
2 0
D3.js Biểu diễn dữ liệu dạng tree bằng việc trải nó ra trên bản đồ Series Today I Learn trong vòng 100 ngày thử thách bản thân ngày 15. Mỗi ngày 1...
Minh-Trung Nguyễn viết 6 tháng trước
2 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

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


White
{{userFollowed ? 'Following' : 'Follow'}}
58 bài viết.
74 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á!