[英]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.