2016-01-04 29 views
6

Tôi đang xem ví dụ này về việc sử dụng hàm reduce().JavaScript - ví dụ về hàm reduce()

function add(runningTotal, currentValue) { 
    return runningTotal + currentValue; 
} 

var nums = [1,2,3,4,5,6,7,8,9,10]; 
var sum = nums.reduce(add); 
print(sum); // displays 55 

Bạn có thể cho tôi xem một số ví dụ khác về cách sử dụng giảm() - Tôi không chắc tôi hoàn toàn theo dõi cách hoạt động.

Cảm ơn bạn

+1

Có vấn đề gì với ví dụ bạn đã cung cấp? – Sampson

+0

Bất kỳ ví dụ nào khác có khả năng gây nhầm lẫn cho bạn nhiều hơn. Ví dụ đó là cách sử dụng cơ bản nhất, dễ hiểu. – Barmar

+1

Hãy xem cái này. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce – Shyju

Trả lời

9

gì làm giảm không được lấy một initialValue, một function với 2 thông số cần thiết (có thể mất nhiều hơn) và a list giá trị. Nếu không có initialValue được cung cấp thì nó được cho là phần tử đầu tiên của danh sách. Chức năng này được yêu cầu làm một cái gì đó với previousValue thường được sử dụng như một bộ tích lũy và nextValue.

Vì vậy, giả sử bạn có danh sách giá trị: [1, 2, 3, 4, 5] và chức năng được cho là thêm 2 tham số và initialValue của 0.

Bước đầu tiên:

0 + 1 = 1 
    2 
    3 
    4 
    5 

Thứ hai bước:

1 + 2 = 3 
    3 
    4 
    5 

thứ ba Bước:

3 + 3 = 6 
    4 
    5 

Bước thứ tư:

6 + 4 = 10 
    5 

Bước thứ năm:

10 + 5 = 15 //Final value 

Như bạn thấy, đầu vào đã đi từ một list đến một giá trị duy nhất, do đó tên reduce. Trong ví dụ của bạn, không có initialValue (đó là đối số thứ hai), do đó, nó như thể bắt đầu ở bước thứ hai. .

+0

Tôi nghĩ bây giờ nó có ý nghĩa. Nó thực sự không khác nhiều so với: function myAdd (arr) { var sum = 0; cho (var i = 0; i Wasteland

+0

Quyền đó sẽ tạo ra cùng một kết quả, tuy nhiên hãy chú ý rằng 'reduce' là tổng quát hơn. Trong ví dụ của tôi, nó thực hiện 'x + y' trên mỗi bước, đó là hàm được cung cấp. Nó thực sự làm 'f (x, y)' trên mỗi bước. 'f' có thể nhiều hơn là chỉ thêm giá trị. – MinusFour

2

Bạn có thể đặt số thứ hai cho giảm

function add(runningTotal, currentValue) { 
 
    return runningTotal + currentValue; 
 
} 
 
var someInitValue = 10 
 
var nums = [1,2,3,4,5,6,7,8,9,10]; 
 
var sum = nums.reduce(add, someInitValue); 
 
console.log(sum); // displays 65

+0

Và thậm chí hơn nữa - nó có ý nghĩa để luôn luôn xác định giá trị ban đầu. – zerkms

3

reduce() hoạt động bằng cách lặp lại trên một mảng và gọi một hàm reductor (chức năng này là đối số đầu tiên truyền cho reduce() Chức năng này có bốn đối số:

  • previousValue, đó là sắp xếp của một 'chạy tổng' . đây là bước đầu xác định, trừ khi bạn cung cấp một giá trị giống như là đối số thứ hai để reduce().
  • currentValue đó là một đối tượng trong mảng của bạn
  • index giá trị hiện tại trong mảng của bạn
  • array, mảng tự

khi chức năng reductor bạn được gọi là, giá trị trả về của nó trở thành previousValue luận mới cho lần sau chức năng reductor được gọi. đó là phép thuật.sau khi hàm reductor được gọi và cho đối tượng cuối cùng trong mảng, giá trị trả về của nó sẽ là giá trị trả về là reduce().

một cách trung thực, rất nhiều ví dụ bạn sẽ thấy (như sử dụng reduce() để tổng hợp một loạt các số nguyên) khá dễ thực hiện với vòng lặp for(). giá trị thực của nó là khi bạn đang thực hiện functional programming.

1

Bạn cũng có thể sử dụng giảm để thực hiện những việc như tạo một số loại mật mã luồng.

var plaintext = "thisisaplaintext"; 
var chars = plaintext.split(''); 
var result = ''; 
function encrypt(runningTotal, currentValue){ 
    var newVal = ((runningTotal + (""+runningTotal).charCodeAt()-32) % 94)+32 
    result = result + String.fromCharCode(newVal) 
    return newVal; 
} 
chars.reduce(encrypt, 15 /*any arbitrary starting value*/); 
console.log(result); 

Về cơ bản, mọi thứ có thể được thực hiện với sự kết hợp các phép tính độc lập hoặc bất kỳ thứ gì yêu cầu tổng số cán. Đó là không có gì mà bạn không thể làm với một vòng lặp for, nhưng nó trông sạch hơn.