2016-10-01 91 views
2

我正在處理一個問題,其中一個數組作爲解構結構參數傳遞給一個函數,然後該函數用於遞歸地將數組中每個數字元素的值加倍。 (演習的目的是制定一個解決方案不使用數組輔助方法瞭解遞歸函數的解構參數

const numbers = [1, 2, 3] 
// should return '[2, 4, 6]' 

這裏的解決方案,我發現:

function double([first, ...rest]) { 
    if (rest.length) { 
    return [first * 2, ...double(rest)]; 
    } else { 
    return [first * 2]; 
    } 
} 

(FWIW我也注意到,這解決方案將在您忽略else條件時起作用。)

我在努力瞭解第二個塊中的操作first * 2如何轉換爲rest作爲參數...double(rest)。任何相關的輸入/參考將非常感謝!

+1

你說的是'返回[第一的例子* 2];'在'else'塊?它與「休息」沒有任何關係。 –

+0

它是遞歸的,它需要任何數量的參數。第一個參數總是定義爲「first」,而其餘的參數使用rest參數,並且將是一個數組。 然後它將這些參數傳遞給下一個遞歸調用,其中「rest」數組中的第一個數字將作爲「first」傳遞給下一個調用等,直到沒有更多參數爲止 – adeneo

+0

將空值檢查是否爲空數組的情況(在這種情況下'first'將會是'undefined',並且您應該返回'[]')。然後它將與一個空數組一起工作,現在情況並非如此。 – 2016-10-01 05:40:15

回答

1

打破你的代碼...

[first, ...rest] = [1,2,3] //returns first = 1; rest = [2,3] 

在第二個電話,而無需使用擴散..

[1 * 2, double(rest)] //rest = [2,3] 
[first, ...rest] = [2,3] //returns first = 2, rest = 3 
[1*2, [2*2, double(rest)] 

在第三個電話,而無需使用擴散..

[1*2, [2*2, double(rest)]//rest = [3] 
[first, ...rest] = [2,3] //returns first = 2, rest = [3] 
[1*2, [2*2, [3*2]] 

它給出[2,[4,[6]]]

通過使用...double()代替double(),陣列將是扁平化和返回[2,4,6]

下面是沒有spread(...)

function double([first, ...rest]) { 
 
    if (rest.length) { 
 
    return [first * 2, double(rest)]; 
 
    } else { 
 
    return [first * 2]; 
 
    } 
 
} 
 

 
console.log(double([1,2,3]))

+0

可愛!我現在看到我是如何忽略使用這種解構語法的扁平化方面的 –