Đối số thứ nhất (previousValue) trong prototype reduce hoạt động như thế nào?

Chào ạ,

    const array1 = [1, 2, 3, 4];
    const callback = (previousValue, currentValue) => {
     console.log({ "pre": previousValue, "current": currentValue }) 
    };

log ra:

{ pre: 1, current: 2 }
{ pre: undefined, current: 3 }
{ pre: undefined, current: 4 } 

previousValue bị undefined kể từ lần init đầu tiên nhưng tại sao không phải là :

{ pre: 1, current: 2 }
{ pre: 2, current: 3 }
{ pre: 3, current: 4 } 

Em không hiểu tại sao khi sử dụng reduce bắt buộc phải có return và giá trị return của vòng lặp trước đó lại trở thành đối số thứ nhất previousValue của các lần lặp sau cho đến hết mảng (giá trị 3,6 của log bên dưới)

const array1 = [1, 2, 3, 4];
const callback = (previousValue, currentValue) => {
    console.log({ "pre": previousValue, "current": currentValue })
    return previousValue + currentValue;
 };
const result = array1.reduce(callback);
console.log(result); // ra 10

log ra là:

{ pre: 1, current: 2 }
{ pre: 3, current: 3 }
{ pre: 6, current: 4 }

Ngoài tác dụng tính tổng mảng (hoặc phép toán tương tự) thì reducer còn dùng trong trường hợp nào nữa không?

Làm sao để mở API của hàm reduce này ra xem bên trong được code như thế nào?

Em cảm ơn :heart_eyes:

Vì Reduce là từ một iterable quy về một giá trị. Giá trị này không hẳn phải là đơn trị :smiley: Ví dụ

prefix_sum([1,2,3,4]) //[1, 3, 6, 10]
7 Likes

Anh giải thích rõ hơn giúp em với, em thấy giống hàm sort vì cũng có 2 tham số

Vì đó là quy ước do dev quy định khi tạo method reduce.
Method reduce có thể được implement theo cách sau, detail có thể sẽ khác nhưng tư tưởng sẽ tương tự:

function myReduce(array, callback) {
  var result = arr[0];
  var i;
  for (i = 1; i < arr.length; i++) {
    result = callback(result, arr[i], i);
  }
  return result;
}

myReduce([1,2,3], callback);

10 Likes

do bạn không return trong callback nên sau lần chạy đầu tiên, kết quả là trả về undefined, kết quả này lại được reduce truyền vào tham số đầu tiên của callback, cứ thế các lần sau đều undefined hết

7 Likes

Một ví dụ cho reduce (hay lfold) là phép cộng dồn:

2 + 3 + 5 + 7 + 11 = ?
0 + 2 = 2
2 + 3 = 5
5 + 5 = 10
10 + 7 = 17
17 + 11 = 28

Tổng từ phép tính trước được đưa vào cho phép tính sau. Cũng tương tự, hàm phải trả về kết quả thì lời gọi hàm tiếp theo mới có mà sử dụng.

9 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?