Если еще в foreach - PullRequest
       3

Если еще в foreach

0 голосов
/ 25 мая 2018

У меня есть массив arr=[{key: 'first'},{key: 'second'} ...], я хочу пройти через этот массив и проверить, существует ли элемент с определенным ключом и что-то сделать.

  arr.forEach(element => {
     if(element.key === 'first') {
        // do something
     } else { 
        // do something else
     }

     if(element.key === 'second') {
        // do something
     } else { 
        // do something else
     }         
  });

Дело в том, что когда он проходит через массивсначала он видит 'first' и проходит через оператор if(), но он также проходит через оператор else() элемента 'second', потому что не нашел его, и так же происходит, когда foreach проходит через другие элементыв массиве.Я не знаю, как заставить его пройти массив один раз и установить if() else() соответствующим образом.Поэтому, когда он находит 'first', я хочу, чтобы он просто сделал if() этого элемента, а не else() других.Я надеюсь, вы понимаете.Заранее спасибо!

Редактировать: Моя логика в этом коде заключается в том, что когда я вызываю базу данных и нахожу этот массив, если в этом массиве нет 'firstExercise', он должен добавить его в эту базу данных (я используюfirebase, поэтому в else() я вызываю db для создания этого упражнения), и если в массиве есть 'firstExercise', ничего не делайте.Извините, что не разъяснил это.

Edit2: Вот мой оригинальный код:

  res.forEach(element => {
     if (this.numbOfFinished === 1) {
       if (element.key === 'firstExercise') {
           console.log('has')            
      } else {
        awardName = 'firstExercise'
        this.homeService.addAward(this.userId, awardName).then(() => {
          this.awardName = 'firstExercise';
         this.awarded = true;
         });
       }
     }
   });


     if (this.numbOfFinished === 5) {
       if (element.key === 'fifthExercise') {
           console.log('has')            
      } else {
        awardName = 'fifthExercise'
        this.homeService.addAward(this.userId, awardName).then(() => {
          this.awardName = 'fifthExercise';
         this.awarded = true;
         });
       }
     }
   });

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

Вам необходимо объединить операторы if следующим образом:

  arr.forEach(element => {
     if(element.key === 'first') {
        // do something
     } else if(element.key === 'second') {
        // do something else
     }         
  });

element.key имеет одно значение в каждой итерации, и поэтому вам необходим один уровень подготовки.

0 голосов
/ 25 мая 2018

Если вы хотите, чтобы из них выполнялась только одна опция (и затем выход из функции), вы можете использовать else if операторы, например, так:

arr.forEach(element => {
  if(element.key === 'first') {
     // do something
  } else if(element.key === 'second') {
     // do something
  } else { 
     // do something else
  }         
});

Это будет в значительной степени точночто вы ожидаетеЕсли element.key == 'first', он будет блокировать один.Иначе, если element.key == 'second', это сделает блок два.Иначе, это сделает блок три.

0 голосов
/ 25 мая 2018

Мне лично нравится создавать массивы, которые устанавливают связь между ключом и функциями.Так что я могу повторить и назвать правильный.

Что мне нравится в этом решении вместо использования леса switch/case или if/else, так это то, что вы можете применять автоматические процедуры и что вы можете легко сделать это для развития.

const mapKeyFunc = [{
  key: 'first',

  func: async(x) => {
    console.log('Do something for key first');

    // here you can perform an async request and modify `this`
  },
}, {
  key: 'second',

  func: async(x) => {
    console.log('Do something for key second');

    // here you can perform an async request and modify `this`
  },
}];

const doStuff = async(arr) => {
  for (let i = 0; i < arr.length; i += 1) {
    const mapElement = mapKeyFunc.find(x => x.key === arr[i].key);

    await mapElement.func.call(this, arr[i]);
  }
};

const arr = [{
  key: 'first',
  otherStuff: 0,
}, {
  key: 'second',
  otherStuff: 42,
}];

doStuff(arr).then(() => {}).catch(e => console.log(e));

Если вам не нужна синхронизация лечения, здесь у нас есть асинхронный метод

const mapKeyFunc = [{
  key: 'first',

  func: async(x) => {
    console.log('Do something for key first');

    // here you can perform an async request and modify `this`
  },
}, {
  key: 'second',

  func: async(x) => {
    console.log('Do something for key second');

    // here you can perform an async request and modify `this`
  },
}];

const doStuff = async(arr) => {
  await Promise.all(arr.map(x => mapKeyFunc.find(y => y.key === x.key).func.call(this, x)));
};

const arr = [{
  key: 'first',
  otherStuff: 0,
}, {
  key: 'second',
  otherStuff: 42,
}];

doStuff(arr).then(() => {}).catch(e => console.log(e));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...