2015-11-12 24 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']一起返回。