2015-11-12 26 views
1

這是來自nodechool的功能性JavaScript研討會。這裏是代碼,因爲它出現在那裏:這個遞歸函數是如何結束的?

function toUpperArray(items) { 
    if (!items.length) return [] // end condition 
    var head = items[0]    // item to operate 
    head = head.toUpperCase()  // perform action 
    var tail = items.slice(1)  // next 
    return [head].concat(toUpperArray(tail)) // recursive step 
} 

toUpperArray(['hello', 'world']) // => ['HELLO', 'WORLD'] 

我不明白「最終條件」如何工作。我認爲條件是尋找items.length爲0,但它然後返回一個空數組?我試圖通過讓它不返回任何東西來運行它,這會返回undefined,從而將未定義的數組添加到最終數組中,但我不確定爲什麼返回一個空數組修復了這個問題。我期望最後一個數組中的最後一個項目是一個空數組。

而且,我從來沒有見過一個條件未使用大括號。這很重要嗎?

+2

因爲'[head] .concat([])'會返回'[head]'。 –

+2

另外'{}'是隻有一個語句的情況下可選的。 –

+0

在MDN上閱讀關於「if」的信息以獲取大括號https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/if...else – epascarello

回答

1

當items.length將eqal設置爲0(false)時,該函數將返回一個空數組,並將遞歸遞歸調用堆棧。這是一對夫婦的方式,我們可以這樣寫這個條件:

if(!items.length) //true 
if(items.length == 0) //true 
if(items.length == false) //true 

對於沒有大括號的條件。它做同樣的事情,但它僅需要當前行或下一行作爲你的病情的「內容」:

if(randomBoolean) 
    console.log('this is executed'); 

console.log('this is always executed'); 

在那個例子中,如果randomBoolean變量爲真輸出將是:

this is executed 
this is always executed 

如果randomBoolean變量是假的,你會看到:

this is always executed 
2

當數組爲空。即items.length == 0。以下條件是!= 0的簡寫形式,因爲0是javascript中的一個假值,而不是0應該是true

if (!items.length) return []; 
-2

它將數組中的所有值轉換爲大寫。

可以使用for循環,但他們基本上只是調用下一個數組值的函數。

2

這是因爲concat功能,這要求ArrayArray作爲參數產生Array作爲結果。基本上可以看出它以這種方式:

  • 空數組的上部陣列是一個空數組(基礎情況)
  • 與至少一種元素的陣列的上陣列(認爲它作爲element,[array] )爲element.toUpperCase()通過遞歸調用(遞歸步驟)

與陣列的拖尾部分串接基本上你有一個數組data = [e1, e2, ..., en]和功能f(x)。您希望返回[f(e1), f(e2), ..., f(en)],因此您基本上將該函數應用於數組上的第一個元素,並將結果與​​同一個數組上沒有第一個元素的同一遞歸函數返回的值連接起來。

1
function toUpperArray(items) { 
    if (!items.length) return [] // end condition 
    var head = items[0]    // item to operate 
    head = head.toUpperCase()  // perform action 
    var tail = items.slice(1)  // next 
    return [head].concat(toUpperArray(tail)) // recursive step 
} 
  • 1號線:如果沒有離開數組中的項, 返回與沒有在它的陣列。
  • 第2行:取給定陣列的第一項
  • 第3行:將其轉化爲大寫字母
  • 4行:創建一個新的數組,而不只是變換項目
  • 第5行:調用與其餘數組一起使用,將其與轉換後的項連接並返回。

會發生什麼情況?讓我們舉個例子吧:

[X,Y]表示你有一個array [0] = X,array [1] = Y的數組,所以你有items [0] ='hello',items [1 ] ='世界'。

第一個電話正在將'hello'變爲'HELLO'。

其餘的數組是['world']。

然後再次調用函數並將其轉換爲'WORLD'。

然後再次調用它,沒有項目,然後返回一個空數組。這意味着第二次調用也可以通過將['WORLD']與[]進行合併來返回。

然後第一個調用可以通過將['HELLO']與['HELLO','WORLD']作爲['WORLD']一起返回。