#javascript #arrays #reactjs #recursion
#javascript #массивы #reactjs #рекурсия
Вопрос:
Я создал рекурсивную функцию, которая сортирует мой вложенный объект, получает от него сообщения в зависимости от некоторых свойств. В конце я хочу получить массив с сообщениями, но когда функция повторяет себя, она перезаписывает старый массив. Как продолжать отправлять сообщения в массив без потери предыдущих сообщений и возвращать этот массив
Я попытался воспроизвести свой код в jsfidle, но моя рекурсивная функция выполняется только один раз. В любом случае, если вам нужен объект, с которым я работаю, вот ссылка https://jsfiddle.net/armakarma/hvj62una/1 /
getMessageFromStage(data, algoritmID, stageIDS) {
let stage = data[algoritmID][stageIDS]
let result = []
let nextStageId = null
let nextAlgId = null
// here i'm pushing messages to result array
if (stage.messages.length) {
for (let i = 0; i < stage.messages.length; i ) {
if (stage.messages[i].message_type === "text") {
result.push(stage.messages[i].message)
}
}
}
if (stage.render === true) {
nextStageId = stage.stageID
} else {
nextStageId = 1
}
if (stage.algoritm_id) {
nextAlgId = stage.algoritm_id
} else {
nextAlgId = algoritmID
}
if (nextStageId amp;amp; nextAlgId amp;amp; stage.render) {
this.getMessageFromStage(data, nextAlgId, nextStageId)
}
}
Комментарии:
1. Пожалуйста, упростите проблему, каковы ваши входные и желаемые выходные данные, я видел ваши данные объекта, что вы пытаетесь вывести?
Ответ №1:
По крайней мере, два решения.
- Создайте внешнюю функцию, которая объявляет
results
и выполняет первый вызовgetMessageFromStage
.
myFun(data, algoritmID, stageIDS) {
const results = [];
this.getMessageFromStage(data, algoritmID, stageIDS);
return results;
}
- Создайте
results
еще один, необязательный, аргументgetMessageFromStage
и передавайте его вместе с каждым рекурсивным вызовом.
getMessageFromStage(data, algoritmID, stageIDS, results = []) {
//...
if (nextStageId amp;amp; nextAlgId amp;amp; stage.render) {
this.getMessageFromStage(data, nextAlgId, nextStageId, results);
}
}
Комментарии:
1. второе решение идеально подходит для меня! большое вам спасибо