Как разбить вложенные циклы Lodash - PullRequest
2 голосов
/ 09 июля 2019

Какой будет лучший способ разорвать вложенные циклы Lodash?

PS Альтернативный способ выполнения вложенных циклов с помощью Lodash также позволяет избежать проблемы.

Вот пример псевдокода:

function findItem(elements:any,itemName:string):boolean
{
   let result = false;
   _.forEach(elements,(element:any)=>{
           _.forEach(element.items, (item:any) => {
              if(item.name === itemName)
              {
                 result = true;
                 return false; // here will exit only the current forEach !!!
              }
           }
   }
   return result;
}

Ответы [ 2 ]

1 голос
/ 09 июля 2019

С lodash вы можете использовать объединение _.forEach() с _.find(), поскольку _.find() возвращается немедленно, когда предикат возвращает true.Когда _.find() возвращает результат, присвойте его result и верните false, чтобы выйти из _.forEach():

function findItem(elements: any, itemName: string): boolean {
  let result = null;
  _.forEach(elements, (element: any) => {
    const res = _.find(element.items, item => item.name === itemName);

    if(res) {
      result = res;
      return false;
    }
  }
  return result;
}

В ванильном JS / машинописном тексте вы можете использовать вложенный for...of зацикливается и возвращает предмет, когда вы его найдете:

function findItem(elements: any, itemName: string): boolean {
  for(const el of elements) {
    for(const item of el.items) {
      if (item.name === itemName) {
        return item;
      }
    }  
  }

  return null;
}
0 голосов
/ 09 июля 2019

Вы найдете https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label очень полезным.

Если вместо этого вы используете обычные петли for of, вы можете пометить их и continue/break на основе метки

function findItem(elements: any, itemName: string): boolean {
  outer:
  for(const el of elements) {
    innner:
    for(const item of el.items) {
        //can 'break outer' here.
    }  
  }
}
...