2017-06-19 62 views
0

我有一個函數:Reduce函數額外托架含義 - JS

function ross(array) { 
    return array.map(function(data) { 
    return data.reduce(function(obj, item) { 
     obj[item[0]] = item[1]; 
     return obj; 
    }, {}); 
    }); 
} 
ross(array); 

基本上這個代碼的3維陣列,以對象的數組轉換。我希望把重點放在這一部分:

return data.reduce(function(obj, item) { 
     obj[item[0]] = item[1]; 
     return obj; 
    }, {}); 

return obj,你會看到另一個額外{}括號中的逗號旁(,)。不確定它是一個回調或者什麼時候會發生什麼。但我試圖通過將其更改爲[]來實現,並且它實際上將輸出更改爲二維數組。

任何人都可以解釋額外的括號做什麼?

+3

您是否檢查了[documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce)?它告訴你它到底是什麼。 – Li357

回答

3

那些{}定義了一個空對象。 reduce的第二個參數是傳遞給您的回調的累加器的種子值。因此,{}正在定義您的回撥在第一次呼叫(以及所有後續呼叫,因爲它返回obj)時認爲是obj

該代碼在功能上等同於:

var obj = {}; 
data.forEach(function(item) { 
    obj[item[0]] = item[1]; 
}); 
return obj; 

reduce只是被使用(有些人會說AB使用,因爲蓄能器永遠不會改變,但它是非常常見的),使一個最外層的語句,而比三。

+0

我的大腦並沒有接受它,如果有可能得到一些例子,你可以嘗試逐行解釋它嗎?我很抱歉,我真的想明白它的作用。 –

+0

*如果* forEach *可能被設置爲返回一個調用者定義的值而不是* undefined *,就像'array.forEach(callbackfn,thisArg,accumulator)',並且if提供,它可能是傳遞給* callbackfn *的第四個參數。 ;-) – RobG

1

From MDN:「reduce()方法對累加器和數組中的每個元素(從左到右)應用一個函數,以將其減少爲單個值。」

第二個參數是累加器的初始值,它作爲參數obj進入您的函數。如果您未指定累加器,則默認值是數組中第一個調用reduce的元素。

+1

MDN的第一句話是不可理解的,除非你知道如何*減少*的作品,必須有更好的方式來說。 : - / – RobG