Thứ sáu, 04/09/2020 | 00:00 GMT+7

Giải thích về phương pháp rút gọn JavaScript

Giảm là một phương pháp có thể khó hiểu, đặc biệt là với tất cả các giải thích mơ hồ có thể tìm thấy trên web. Có rất nhiều lợi ích khi hiểu reduce vì nó thường được sử dụng trong quản lý nhà nước (nghĩ Redux ).

Chữ ký cho phương thức mảng reduce trong JavaScript là:

arr.reduce(callback, initialValue); 

Thuật ngữ

Giảm đi kèm với một số thuật ngữ như bộ giảm tốc & bộ tích lũy . Bộ accumulator là giá trị mà ta kết thúc và bộ reducer là hành động mà ta sẽ thực hiện để đạt được một giá trị .

Bạn phải nhớ rằng một bộ giảm sẽ chỉ trả về một giá trị và một giá trị duy nhất do đó tên giảm .

Lấy ví dụ cổ điển sau:

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

Ở trên sẽ cho ta 30 (5 + 10 + 15). Điều này hoạt động tốt, nhưng ta có thể làm điều này với reduce thay vì sẽ giúp ta tránh việc thay đổi biến value .

Đoạn mã dưới đây cũng sẽ xuất ra 30 , nhưng sẽ không làm thay đổi biến value của ta (mà bây giờ ta gọi là initialValue )

/* this is our initial value i.e. the starting point*/ const initialValue = 0;  /* numbers array */ const numbers = [5, 10, 15];  /* reducer method that takes in the accumulator and next item */ const reducer = (accumulator, item) => {   return accumulator + item; };  /* we give the reduce method our reducer function   and our initial value */ const total = numbers.reduce(reducer, initialValue) 

Đoạn mã trên có thể trông hơi khó hiểu, nhưng không có phép thuật nào xảy ra. Hãy thêm một console.log trong của ta reducer phương pháp mà ý chí sản lượng accumulatoritem đối số.

Ảnh chụp màn hình sau cho thấy những gì được ghi vào console :

Giảm sản lượng

Vì vậy, điều đầu tiên ta nhận thấy là phương thức của ta được gọi 3 lần vì có 3 giá trị trong mảng của ta . Ắc của ta bắt đầu từ 0 mà là của ta initialValue ta truyền cho reduce . Trên mỗi lần gọi hàm, item này sẽ được thêm vào bộ accumulator . Lệnh gọi cuối cùng đến phương thức có giá trị accumulator15item15 , 15 + 15 cho ta 30 là giá trị cuối cùng của ta . Hãy nhớ phương thức reducer trả về bộ accumulator cộng với item .

Vì vậy, đó là một ví dụ đơn giản về cách bạn sẽ sử dụng reduce , bây giờ hãy đi sâu vào một ví dụ phức tạp hơn.

Làm phẳng một mảng bằng cách sử dụng Reduce

Giả sử ta có mảng sau:

const numArray = [1, 2, [3, 10, [11, 12]], [1, 2, [3, 4]], 5, 6]; 

Và giả sử vì một lý do điên rồ nào đó, JavaScript đã loại bỏ phương thức .flat nên ta phải tự san phẳng mảng này.

Vì vậy, ta sẽ viết một hàm để làm phẳng bất kỳ mảng nào dù các mảng được lồng sâu như thế nào:

function flattenArray(data) {   // our initial value this time is a blank array   const initialValue = [];    // call reduce on our data   return data.reduce((total, value) => {     // if the value is an array then recursively call reduce     // if the value is not an array then just concat our value     return total.concat(Array.isArray(value) ? flattenArray(value) : value);   }, initialValue); } 

Nếu ta chuyển numArray của numArray cho phương thức này và ghi lại kết quả, ta nhận được như sau:

Làm phẳng  kết quả  mảng

Đây là một ví dụ tuyệt vời về cách ta có thể thực hiện một hoạt động rất phổ biến khá đơn giản.

Hãy xem qua một ví dụ nữa.

Ví dụ cuối cùng - Thay đổi cấu trúc đối tượng

Vì vậy, với trò chơi Pokemon mới sắp ra mắt, hãy giả sử ta có một server gửi cho ta một loạt các đối tượng Pokemon như vậy:

const pokemon = [   { name: "charmander", type: "fire" },   { name: "squirtle", type: "water" },   { name: "bulbasaur", type: "grass" } ] 

Ta muốn thay đổi đối tượng này thành:

const pokemonModified = {   charmander: { type: "fire" },   squirtle: { type: "water" },   bulbasaur: { type: "grass" } }; 

Để có được kết quả mong muốn đó, ta thực hiện như sau:

const getMapFromArray = data =>   data.reduce((acc, item) => {     // add object key to our object i.e. charmander: { type: 'water' }     acc[item.name] = { type: item.type };     return acc;   }, {}); 

Nếu ta gọi phương thức của bạn như vậy:

getMapFromArray(pokemon) 

Ta nhận được kết quả mong muốn của ta :

Đầu ra Pokemon

Bạn có thể xem Codesandbox tại đây .

Kết luận

Ngay từ cái nhìn đầu tiên, rút reduce vẻ phức tạp hơn các Phương pháp lặp lại mảng JavaScript khác như mapfilter , nhưng một khi hiểu cú pháp, khái niệm cốt lõi và trường hợp sử dụng, nó có thể là một công cụ mạnh mẽ khác cho các nhà phát triển JavaScript.


Tags:

Các tin liên quan

Khám phá các hàm Async / Await trong JavaScript
2020-09-04
module ES6 và Cách sử dụng Nhập và Xuất trong JavaScript
2020-09-04
filter () Phương thức mảng trong JavaScript
2020-09-03
Hiểu các hàm mũi tên trong JavaScript
2020-07-31
Cách tạo phần tử kéo và thả với Vanilla JavaScript và HTML
2020-07-27
Hiểu các chữ mẫu trong JavaScript
2020-06-30
Cách sử dụng .map () để lặp lại thông qua các mục mảng trong JavaScript
2020-05-19
Hiểu về cấu trúc hủy, tham số khôi phục và cú pháp trải rộng trong JavaScript
2020-05-12
Cách gỡ lỗi JavaScript với Google Chrome DevTools và Visual Studio Code
2020-05-08
Thanh tiến trình trang với các biến JavaScript và CSS
2020-04-16