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

Bạn có hiểu method reduce của JavaScript không ?

0 0 28

Người đăng: manhdatt

Theo Viblo Asia

Giới thiệu

reduce là một method khá khó hiểu, lại còn có cơ số những lời giải thích khá mập mờ khó hiểu trôi nổi trên internet. Đây là một method cực kì hữu hiệu và sẽ mang lại cực kì nhiều lợi ích nếu chúng ta có thể hiểu được nó. Tiêu biểu là reduce thường xuyên được sử dụng trong các công cụ quản lý state, tiêu biểu là redux.

Một cách sử dụng tiêu biểu của method reduce trong JavaScript:

arr.reduce(callback, initialValue);

Thuật ngữ

reduce bắt nguồn từ 2 thuật ngữ Reducer (bộ giảm)Accumulator (bộ tích luỹ). accumulator chính là kết quả, và reducer là action chúng ta thực hiện để đạt được kết quả đó.

Một điều cần nhớ là reducer chỉ trả về một và chỉ một giá trị (Vì tên nó là reduce mà ).

Xem một ví dụ điển hình nhé:

let value = 0; const numbers = [10, 20, 30]; for(let i = 0; i < numbers.length; i++) { value += numbers[i];
}

Đoạn code trên sẽ trả về 60 (10 + 20 + 30). Trong trường hợp này chúng ta có thể sử dụng reduce để không mutate giá trị của biến value.

Đoạn code phía dưới cũng sẽ trả về 60, tuy nhiên sẽ không mutate bíên value của chúng ta (chúng ta sẽ gọi là initialValue):

// đây là giá trị khơi tạo của chúng ta
const initialValue = 0; const numbers = [10, 20, 30]; // hàm reducer nhận vào tổng hiện tại và một số
const reducer = (sum, number) => { return sum + number;
}; // chúng ta truyền vào method reduce của chúng ta hàm reducer và giá trị khởi tạo.
const total = numbers.reduce(reducer, initialValue);

Đoạn code trên có thể nhìn hơi khó hiểu nhỉ ? Để biết được hàm reduce đang chạy như thế nào thì chúng ta đặt console.log vào hàm reducer nhé:

const reducer = (sum, number) => { console.log('Current sum: ', sum); console.log('Current number: ', number); console.log('-----'); return sum + number;
};

Mở console lên và chúng ta sẽ thấy log sau:

Điều đầu tiên chúng ta thấy sẽ là hàm reducer sẽ chạy 3 lần tương đương với 3 phần tử của mảng numbers. Accumulator (Tổng) của chúng ta sẽ bắt đầu từ 0, đây cũng chính là giá trị khởi tạo initialValue được truyền vào method reduce.

Lần chạy cuối cùng của method sẽ có sum với giá trị là 30, và number là 30, do đó kết qủa là 30 + 30 = 60. Đây cũng chính là kết quả của method reduce của chúng ta.

Đây là 1 ví dụ đơn giản về cách sử dụng method reduce, sau đây chúng ta sẽ thử áp dụng nó vào các ví dụ khác phức tạp hơn nhé.

Flatten một Array sử dụng Reduce

Ví dụ chúng ta có một mảng sau:

const coins = ["BTC", "ETH", ["DOGE", "AQUAGOAT", ["SHIB"]], ["ADA", "XRP"], ["BNB"]];

Chúng ta có thể dùng method .flat của JavaScript luôn là được nhỉ? Bỗng một ngày đẹp trời, JavaScript bỏ luôn hàm ấy đi thì sao ?. Vậy mình thử tự viết lại bằng reduce nhé.

Chúng ta sẽ viết một hàm như sau để flatten tất cả các mảng, bất kể nó sâu thế nào:

const flatten = arr => { // tạo một giá trị khởi tạo là một mảng rỗng  const initialValue = []; // gọi method reduce cho arr return arr.reduce((total, value) => { // nếu value là một mảng thì chúng ta sẽ dùng đệ quy để gọi lại hàm này // nếu value không phải là một hàm thì chỉ việc concat value vào total return total.concat(Array.isArray(value) ? flatten(value) : value); }, initialValue);
}

Thử áp dụng với mảng numbers bên trên thì ta được kết quả sau:

Thử một ví dụ khác nữa nhé:

Thay đổi cấu trúc Object

Ví dụ server trả về một list coins như sau:

const coins = [ { key: "BTC", name: "BitCoin" }, { key: "ETH", name: "Ethereum" }, { key: "ADA", name: "Cardano" }
]

Và chúng ta cần thay đổi thành một object dạng như sau:

const coins = { btc: { name: "BitCoin" }, eth: { name: "Ethereum" }, ada: { name: "Cardano" }
}

Để làm được vậy thì chúng ta cần viết một hàm như sau:

const getMapFromArray = arr => arr.reduce((obj, item) => { // thêm object key vào cho object của chúng ta obj[item.key.toLowerCase()] = { name: item.name }; return obj; }, {});

Khi chạy thì chúng ta sẽ có kết quả sau:

Kết

Khi mới tìm hiểu, có thể method reduce sẽ hơi khó hiểu và khó tiếp cận hơn một số method khác của Array như map hoặc filter, nhưng chỉ cần hiểu khái niệm, cú pháp và use-case thì nó có thể trở thành một công cụ cực kì hiệu quả trong tay chúng ta.

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 502

- 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 415

- 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 137

- 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 120

- 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 94

- 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 230