Прервать цикл forEach (javascript)

2336
07 января 2017, 15:41
massiv.forEach(function(item, i) {
  if (item == "1") {
    console.log(i);
    return false;
  }
});

Есть массив со значениями.

Внутри цикла есть условие поиска значения массива.

Задача: остановить дальнейший перебор цикла при первом найденном значении.

Спасибо за помощь.

Решение: (спасибо Lieutenant Jim Dangle)

[1, 2, 3, 4, 3].some(function(el,i) {
         if (el == 3) {  
         console.log(i);
         return el;
         }
    }); 
Answer 1

метод forEach не предусматривает возможности прервать обход коллекции.

Если нужно проверить наличие конкретного элемента удовлетворяющего условию, лучше использовать метод some

var massiv = ['2', '1', '3']; 
 
console.log(massiv.some(function(item) { 
  console.log('some', item); 
  return (item == "1"); 
}));

Если проверяются полностью объекты, можно использовать метод indexOf

var massiv = ['2', '1', '3']; 
 
console.log(massiv.indexOf("1"));

Если нужно найти индекс элемента удовлетворяющего условию, то подойдет метод findIndex

var massiv = ['2', '1', '3']; 
 
console.log(massiv.findIndex(function(item) { 
  console.log('findIndex', item); 
  return item == "1"; 
}));

Если очень хочется использовать именно forEach - можно поместить его в try..catch и кидать ошибку если элемент найден.

var massiv = ['2', '1', '3']; 
try { 
  massiv.forEach(function(item, i) { 
    console.log('foreach', i); 
    if (item == "1") { 
      throw { 
        reason: "finded", 
        index: i 
      } 
    } 
  }); 
} catch ({ 
  reason, index 
}) { 
  if (reason) { 
    console.log(reason, ':', index) 
  } 
}

Вместо встроенных функций массива, можно также воспользоваться циклом for. В этом случае для прерывания цикла можно использовать выражение break

Answer 2

Mожно остановить loop посредством вызова несуществующей функции и перехвата ошибки:

var massiv = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
 
try { 
  massiv.forEach(function(item, i, vvv) { 
    console.log(item); 
    if (item == "5") { 
      vvv(); 
    } 
  }); 
} catch (e) {}

Answer 3

[1, 2, 3].some(function(el) { 
  console.log(el); 
  return el === 2; 
});

Answer 4

В методе forEach не предусмотренa остановка как в лупе посредством брейк.

Использовать every заместо forEach. Когда будет false, все остановится.

Это самый правильный способ.

massiv.every(function(item, i) {
  if (item == "1") {
    console.log(i);
    return false;
  } else {
    return true;
  }
});
READ ALSO
Проблема со сложением в калькуляторе Jquery

Проблема со сложением в калькуляторе Jquery

Необходимо посчитать сумму платежа по формуле: (Сумма займа * процентную ставку * кол-во месяцев + сумму займа)

325
Компиляция TypeScript в JS в редакторе Atom [требует правки]

Компиляция TypeScript в JS в редакторе Atom [требует правки]

Добрый вечер, друзьяПомогите, пожалуйста

398