首页 > 解决方案 > 递归函数+数组意外行为的串联

问题描述

这不是一个需要解决方案的技术问题,但更多的是我想要对 JavaScript 和递归函数有更好的技术理解。

我编写了一个递归函数来调用 API 来获取所有记录,直到没有记录可供获取。

下面是它的基本工作形式。这将返回数组中预期的记录数。

async function getRecords(page, recordsArray) {
    const records = await <axios api call>
    const moreRecords = records.more_records
    if(!moreRecords) {
        return recordsArray.concat(records.data)
    } else {
        return await getRecords(page + 1, recordsArray.concat(records.data))
    }
}

然而,当我最初编写这个函数时,我像下面的那样做了,它没有返回预期的记录数,我真的不明白为什么。我预计会的。

async function getRecords(page, recordsArray) {
    const records = await <axios api call>
    const moreRecords = records.more_records
    if(!moreRecords) {
        recordsArray.concat(records.data)
        return recordsArray
    } else {
        return await getRecords(page + 1, recordsArray.concat(records.data))
    }
}

问题

为什么第二个没有返回预期的记录数,而第一个却返回了?

标签: javascriptarraysfunctionrecursion

解决方案


concat不修改现有数组;相反,它返回一个数组。

const arr = [1, 2, 3];
const newArr = arr.concat([4, 5]);
console.log(arr);
console.log(newArr);

如果您想调整第二个片段以使其工作,而不使用第一个片段,请将项目从 推records.data送到 ,recordsArray以便原始数组在返回时包含新项目:

    if(!moreRecords) {
        recordsArray.push(...records.data)
        return recordsArray
    } else {

推荐阅读