для каждого разрыва цикла перед завершением массива - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть простая функция просмотра объекта в массиве.Если он не находит соответствия на основе свойства, он проверяет, есть ли у него дочерние элементы, а затем проверяет каждое из них на предмет значения свойства.

Кажется, что он работает должным образом с первым объектом с дочерними элементами, однако онне попадает в этот третий слой.

Объект выглядит примерно так:

 data = [{
    title: 'Home',
    route: '/reports/home',
  },
  {
   title: 'Layer 2',
   children: [
     { title: 'Title 1', route: '/reports/title1' },
     { title: 'Title 2', route: '/reports/title2' },
   ],
  },
  {
    title: 'Layer 3',
    children: [
      { title: 'Title 3', route: '/reports/title3' },
      { title: 'Title 4', route: '/reports/title4' },
    ],
  }];


lookUpTitle = navGroup => {
  for (let item of navGroup) {
    if (item.route && item.route.toLowerCase() === '/reports/title3') {
      console.log(item.title)
      return item.title;
    } else {
      if (item.children) {
        return this.lookUpTitle(item.children);
      }
    }
  }
};
    
lookUpTitle(data)

Я просто вызываю функцию и передаю массив, как указано выше.

Я могу найти заголовок 2 просто отлично, но функция не будет повторятьсядо третьего объекта в массиве, если я ищу заголовок 3 или 4. Чего мне не хватает?

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

есть проблема, из-за return

         if (item.children) {
            //from here it will come out as its return 
             return this.lookUpTitle(item.children);
          }

попробуйте вот так

lookUpTitle = navGroup => {
      const title =[];
      for (let item of navGroup) {
        if (item.route && item.route.toLowerCase() === '/reports/title3') {
          console.log(item.title)
          return item.title;
        } else {
          if (item.children) {
            this.lookUpTitle(item.children);
          } else {
            console.log(item.title);
            return item.title;
          }
        }
      }
    };
0 голосов
/ 25 апреля 2018

Что происходит

Чтобы понять, почему цикл останавливается, давайте напишем, что происходит, шаг за шагом:

  1. item принимает значениепервый объект.(Title = Home).
  2. Условие if не выполнено, а item не содержит children
  3. item принимает значение второго объекта.
  4. Условие if не выполнено, но item содержит children
  5. Функция возвращает результат вызова функции lookUpTitle(), таким образом, цикл останавливается.
  6. GoВернемся к шагу 1, но с дочерними значениями вашего второго объекта.

Таким образом, цикл всегда останавливается, если объект не соответствует условию if и содержит children.

Как это исправить

Чтобы это исправить, мы должны отследить рекурсивные результаты.Проверьте, найден ли результат через рекурсивный вызов lookUpTitle().Если нет, продолжайте цикл, если найден, вы можете вернуть его.Этот метод предполагает, что вы хотите получить только первый найденный результат, а не все существующие результаты.

lookUpTitle = navGroup => {
  for (let item of navGroup) {
    if (item.route && item.route.toLowerCase() === '/reports/title3') {
      return item.title;
    } else {
      if (item.children) {
        var res = this.lookUpTitle(item.children);
        if(res != undefined)
          return res;
      }
    }
  }
};
0 голосов
/ 25 апреля 2018

Если цикл for выполняет итерацию через элемент, у которого есть дочерние элементы (как у второго), он всегда будет возвращать значение, выходя из цикла for.

Для предложения "else" необходимо проверитьдействительно ли lookUpTitle нашел нужный заголовок.Если это так, верните его, если нет, продолжите цикл for.

...