2017-08-24 110 views
0

有一個我正在使用的練習,要求創建一個嵌套數組到對象中的函數。將嵌套數組轉換爲具有減少的對象

例輸入:[['make', 'Ford'], ['model', 'Mustang'], ['year', 1964]] 預期輸出:{ make: 'Ford', model: 'Mustan', year: 1969 }

我嘗試過寫這樣的:

function fromListToObject(array) { 
    let obj = {}; 

    for (var i = 0; i < array.length; i++) { 
     obj[arr[i][0]] = arr[i][1]; 
    } 
} 

但沒有工作,所以我找到了另一個解決方案,它使用的降低:

function fromListToObject(array) { 
    return array.reduce(function(acc, curr) { 
    acc[curr[0]] = curr[1]; 
    return acc; 
}, {}); 
} 

現在,我想我明白了減少如何工作,但從來沒有真正搞亂它的對象,如何acc[curr[0]]是否工作?它開始作爲一個空的對象,但我很困惑,什麼acc是在第一次迭代之後。任何人都可以解釋嗎?

在此先感謝!

+0

什麼不適用於第一個?你有錯誤嗎?如果不是,結果如何? –

回答

1

「現在我想我明白瞭如何減少工作,但從來沒有真正與它搞砸的對象,請問acc[curr[0]]工作?」

acc總是從先前迭代的返回值(或在第一次迭代,如果所提供的初始值,否則該第一陣列元素)。

因此,因爲您總是返回acc,這是您開始的{},那麼acc始終是該起始對象。

curr是數組中的當前項,它是持有要添加到acc對象中的鍵和值的子數組。

+0

哎呀,我覺得我明白髮生了什麼,它只是它的語法拋棄了我: 'acc [curr [0]] = curr [1];'在第一次迭代之前的acc是'{} ,那麼在第一個之後,'acc [curr [0]]'是'make',所以'[curr [0]]'在技術上'make'它只是將它設置爲'acc'中的一個鍵。我有道理嗎?不知道如何在這裏表達我的想法。 編輯:OOOOOH從不知道。我現在知道了。 – user7496931

+0

@ user7496931:是的,我聽到你的聲音。僅供參考,您可以使用Object.assign和新的表達式評估語法將回調減少爲一行。 '返回Object.assign(acc,{[curr [0]]:curr [1]})' – spanky

+0

...是的,我想你已經明白了。 – spanky

1

您可以使用array作爲變量名並返回obj

function fromListToObject(array) { 
 
    let obj = {}; 
 

 
    for (var i = 0; i < array.length; i++) { 
 
     obj[array[i][0]] = array[i][1]; 
 
    } 
 
    return obj; 
 
} 
 

 
console.log(fromListToObject([['make', 'Ford'], ['model', 'Mustang'], ['year', 1964]]))

1

Reduce爲您的回調函數提供了一個對象。然後你的回調函數需要返回一個對象,然後在下一次迭代中再次傳入你的回調函數。所以就像使用數組一樣,您可以根據需要修改對象。

因此,在短期,在降低acc變量的第一次迭代是您在傳遞給減少函數的第二ARG的對象。但是對於之後的每次迭代,acc的值是您在前一次迭代中回調的值。

1

reduce適用傳遞到它的給定列表中的每個元素的功能。該函數接收元素和累加器。最後你會得到一個結果。

所以一個簡單的例子是像reduce([1,2,3], +, 0),只想值相加,作爲蓄能器將開始爲0,然後每個元素和爲它。

在你的情況下,蓄壓器是一個對象,所以當你遍歷的第一個元素將是這樣的:

acc = {} 
element = ['make', 'ford'] 

,所以你用element[0]爲重點改變累加器和element[1]作爲值,將acc轉換爲{ make: 'ford' }

0

reduce取一個函數和一個初始值。該函數爲數組中的每個元素調用並返回該步驟的結果。第一次調用將傳遞給reduce()的初始值,並且每個其他調用都會傳遞前一個函數調用的結果。

所以你的情況它擴展這樣的(f爲你傳遞函數):

let default = {}; 
let a = f(['make', 'Ford'], default); // initial call uses default value 
let b = f(['model', 'Mustang'], a); // uses result of previous call 
let c = f(['year', '1964'], b); 

既然你回來給你傳遞同一個對象,默認情況下,A,B的引用, c將全部是對同一個對象的引用。您正在修改每個步驟的對象,因此沒問題。

0

您的第一個函數看起來像它將以您使用的格式工作,我認爲它不起作用,因爲變量名稱arr不存在。它應該是您傳遞給函數的參數array

function fromListToObject(array) { 
    let obj = {}; 

    for (var i = 0; i < array.length; i++) { 
    obj[array[i][0]] = array[i][1]; 
    } 
} 
相關問題