После ключевого слова return не выходит из функции JS
Есть функция:
function checkAnswer() {
const x0 = document.querySelector('#x0_answer').value;
if (x0 !== '') {
var arr = x0.split('');
arr.forEach(n => {
if (!Number.isInteger(parseInt(n)) && n.toString() !== '.' && n.toString() !== ',') {
alert('bad');
return;
}
});
}
}
После return не выходит из цикла и функции (несколько alert на экране). Что я делаю не так?
Ответы (4 шт):
Автор решения: Eugene X
→ Ссылка
arr.forEach(n => {
Выходит из lambda (анонимной) функции.. )))
function checkAnswer() {
const x0 = document.querySelector('#x0_answer').value;
var BreakException = {};
try {
if (x0 !== '') {
var arr = x0.split('');
arr.forEach(n => {
if (!Number.isInteger(parseInt(n)) && n.toString() !== '.' && n.toString() !== ',') {
alert('bad');
throw BreakException;
}
});
}
} catch (err) {
if (err !== BreakException) throw err;
}
}
Или как альтернатива использовать
for (let n of arr) {
if (isBad(n)) return;
}
Автор решения: LIMPIX64
→ Ссылка
Используйте for вместо forEach. В данном случае return выходит из forEach.
function checkAnswer() {
const x0 = document.querySelector('#x0_answer').value;
if (x0 !== '') {
var arr = x0.split('');
for(const n of arr) {
if (!Number.isInteger(parseInt(n)) && n.toString() !== '.' && n.toString() !== ',') {
alert('bad');
return;
}
}
}
}
Автор решения: Алексей Шиманский
→ Ссылка
Если нужно проверить на то, что все элементы соответствуют условию, то проще воспользоваться методом every. Пример:
console.log([1,2,3].every( el => el !== 1 ))
Автор решения: Evgenii
→ Ссылка
используйте вместо forech метод - some. Она проверяет, чтоб хотяб раз выполнилось условие, короче и чище код:
function checkAnswer() {
const x0 = document.querySelector('#x0_answer').value;
if (x0 !== '') {
var arr = x0.split('');
const bad = arr.some(n => !Number.isInteger(parseInt(n)) && n.toString() !== '.' && n.toString() !== ',');
if (bad) {
alert('bad');
}
}
}