#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)
дает ожидаемое количество записей, потому что он возвращает новый массив с добавленными записями. Спасибо!