2011-11-01 30 views
3

我想要使用jQuery.extend函數將JSON對象數組合併到一個對象。 假設,我有一個樣本陣列:奇怪的結果使用Array.reduce

arr = [{a:4},{b:5}]; 
萬一

arr.reduce($.extend ) 
//result { "1":{b:5}, a:4, b:5 } 

arr.reduce(function(a, b){ return $.extend(a,b) }); 
//is ok: { a:4, b:5 } 

爲什麼呢?

回答

3

傳遞給reduce的函數將接收四個參數(最後兩個是當前項目的索引以及調用reduce的數組)。你只對前兩項感興趣,但jQuery.extend需要可變數量的參數,所以它會把它們全部提起來。通過明確編寫一個帶有兩個參數的函數並將它們傳遞給extend,您可以避免這種情況並獲得您期望的行爲。

1

結果似乎很奇怪只有等到你看到reduce實施,特別是這條語句的循環開始前:

if(arguments.length <= 1) { 
    curr = this[0]; // Increase i to start searching the secondly defined element in the array 
    i = 1; // start accumulating at the second element 
} 

現在有道理。而且extend本質上是動態的,所以它會把你給它的所有東西(不只是你真正想要的兩個參數)。

+0

我同意你的看法.. 你寫的情況下,如果我想定義爲減少的初始值: '[1,2,3]。降低(FN,init_val)' 注意,減少函數總是(在我的示例中)一個參數是函數...看看我的答案。 – abuduba