Рекурсивная функция неожиданное поведение конкатенации массива

#javascript #arrays #function #recursion

#javascript #массивы #функция #рекурсия

Вопрос:

Это не техническая проблема, требующая решения, а скорее то, что я хочу лучшего технического понимания 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))
    }
}
 

ВОПРОС

Почему второй не вернул ожидаемое количество записей, а первый вернул?

Ответ №1:

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 {
 

Комментарии:

1. Хорошо, это имеет смысл, поэтому возврат array.concat(records.data) дает ожидаемое количество записей, потому что он возвращает новый массив с добавленными записями. Спасибо!