递归数组问题

时间:2018-09-30 15:16:12

标签: javascript reactjs recursion

这是递归函数的新问题,无法快速找出以下代码为何起作用,但是当试图在一行中完成所有这些操作时,在React JS中却没有?

Works:
generateDummyData(num, sentences) {
    sentences.push(randomSentence());
    return num === 1 ? sentences : this.generateDummyData(num-1, sentences);
}

Doesnt Work:
generateDummyData(num, sentences) {
    return num === 1 ? sentences : this.generateDummyData(num-1, sentences.push(randomSentence()));
}

任何帮助解释或说明做即时尝试的更好方法的人将不胜感激。期待评论。

更新

一个不错的解决方法是创建一个新数组并将旧数据散布到新数据中。不知道性能和内存是否会受到诸如此类的影响,但是它确实起作用。

generateDummyData(num, sentences) {
    return num === 1 ? sentences : this.generateDummyData(num-1, [...sentences, randomSentence()]));
}

4 个答案:

答案 0 :(得分:4)

sentences.push(randomSentence())不返回数组,但返回数组的新长度。

  

push()方法将一个或多个元素添加到数组的末尾,然后   返回数组的新长度。

Source: MDN push doc

var test = ["a", "b", "c"];

console.log(test.push("d"));

答案 1 :(得分:1)

您要在第二个示例中传递push的结果。 result of push is the length of the array,而不是数组本身。这样的事情应该起作用:

return num === 1 ? 
    sentences : 
    this.generateDummyData(
       num - 1, sentences.push(randomSentence()) && sentences
    );

答案 2 :(得分:1)

Push在向其添加元素之后返回数组的大小,因此在将数据传递给函数时使用它时,它将传递返回的值,而不是在推入值之后传递数组的值。您应该改用concat

generateDummyData(num, sentences) {
    return num === 1 ? sentences : this.generateDummyData(num-1, sentences.concat([randomSentence()]));
}

答案 3 :(得分:0)

根据Array.prototype.push(),它返回

  

方法所基于的对象的新length属性   叫。

因此,在您的示例中,您没有将sequences传递给下一个方法调用,而是传递了序列长度。

这就是为什么这两种方法不相等的原因。