簡體   English   中英

如果初始值為數組,javascript 中的 reduce 如何工作

[英]How reduce in javascript work if initial value is array

 var a = [2,4,5,6,7] a.reduce((acc,cur,i)=>acc,[]) //result: [] a.reduce((acc,cur,i)=>acc,[0,2]) //result (2) [0, 2] a.reduce((acc,cur,i)=>acc[0],[0,2]) /* VM410:1 Uncaught TypeError: Cannot read property '0' of undefined at <anonymous>:1:26 at Array.reduce (<anonymous>) at <anonymous>:1:3 */

為什么我會收到第三個錯誤? 想知道它是如何工作的?

reduce function 用作 for 循環,其中在每次迭代時都會設置一個變量 (acc):

您給出的前兩個示例:

var a = [2,4,5,6,7]

a.reduce((acc,cur,i) => acc, []) 
a.reduce((acc,cur,i) => acc, [0, 2])

相當於在每次迭代時將累加器分配給自身:

var acc = []; // [0, 2] in the second one

for(var i=0; i < a.length; i++){
    acc = acc;
}

而你的最后一個例子:

a.reduce((acc,cur,i) => acc[0], [0, 2])

相當於在每次迭代時將其第一個值賦給 acc

var acc = [0, 2];

for(var i = 0; i < a.length; i++){
    acc = acc[0];
}

每次迭代都將分配給acc它的第一個值。 第一次迭代將如下所示:

acc = [0, 2];
i = 0

acc = acc[0] // 0;

第二次迭代將如下所示:

acc = 0;
i = 1

acc = acc[0] // undefined;

現在acc被賦值為undefined ,因為acc持有的值中沒有這樣的屬性0 因此,第三次迭代將如下所示:

acc = undefined;
i = 2;

acc = acc[0]; // Error, no property '0' of undefined.

您的代碼不返回數組。 但是,累加器將設置為該值。 因此,當您假設acc是一個數組時,它不是在第一次調用累積 function 之后。

您可以做的是以下幾行:

 var a = [2,4,5,6,7]; a.reduce((acc,cur,i) => { acc.push(cur); console.log(`iter ${i}, acc = ${JSON.stringify(acc)}.`); return acc; },[0,2] );

只需確保您的回調在每次調用時都返回一個數組。

Array.reduce 的 mdn 文檔節選

initialValue - 用作回調第一次調用的第一個參數的值。 如果未提供初始值,則數組中的第一個元素將用作初始累加器值並作為 currentValue 跳過。 在沒有初始值的空數組上調用 reduce() 將引發 TypeError。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM