рекурсивная функция как сохранить сообщения в массиве?

#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:

По крайней мере, два решения.

  1. Создайте внешнюю функцию, которая объявляет results и выполняет первый вызов getMessageFromStage .
 myFun(data, algoritmID, stageIDS) {
   const results = [];
   this.getMessageFromStage(data, algoritmID, stageIDS);
   return results;
}
  
  1. Создайте results еще один, необязательный, аргумент getMessageFromStage и передавайте его вместе с каждым рекурсивным вызовом.
 getMessageFromStage(data, algoritmID, stageIDS, results = []) {
  //...
  if (nextStageId amp;amp; nextAlgId amp;amp; stage.render) {
    this.getMessageFromStage(data, nextAlgId, nextStageId, results);
  }
}
  

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

1. второе решение идеально подходит для меня! большое вам спасибо