【问题标题】:Recursion Array Issue递归数组问题
【发布时间】:2018-09-30 15:16:11
【问题描述】:

这是一个初学者的问题。我是递归函数的新手,无法快速弄清楚为什么下面的代码可以工作,但是当尝试在一行中完成所有这些时,它在 React 中没有。

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

// Doesn't 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()]));
}

【问题讨论】:

    标签: javascript reactjs recursion


    【解决方案1】:

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

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

    Source: MDN push doc

    var test = ["a", "b", "c"];
    
    console.log(test.push("d"));

    【讨论】:

    • 更新解决方案
    【解决方案2】:

    您在第二个示例中传递了push 的结果。 result of push is the length of the array,而不是数组本身。像这样的东西应该可以工作:

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

    【讨论】:

      【解决方案3】:

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

      方法所在对象的新长度属性 调用。

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-01-27
          • 2016-07-26
          • 2022-01-08
          • 2011-11-27
          • 2016-02-01
          • 2016-02-01
          • 1970-01-01
          相关资源
          最近更新 更多