Функция, которая принимает массив чисел, которая возращает истинну, если все элементы четные, если бы хотя бы один элемент не четный, то false
Написал код, но понимаю, что перебор true/false будет для каждого элемента. А хочу, чтобы был конкретно один раз для массива. Пробовал через every/some - так ничего и не получилось. Заранее спасибо.
m = [1,2,3];
function checkEven(array) {
array.forEach(function(num) {
if(num % 2) {
alert("false");
} else {
alert("true");
}
})
}
console.log(checkEven(m));
Ответы (1 шт):
Автор решения: ΝNL993
→ Ссылка
Может быть вот так?
function checkEven(array) {
return array.every(e => e % 2 === 0)
}
function log(value) {
console.log(checkEven(value))
}
log([2, 4, 6]) // true
log([1, 2, 3]) // false
log([2, 1, 2]) // false
log([1, 3, 5]) // false
А вообще лучше будет так (Должно работать быстрее чем вариант с every(... => ...)):
function checkEven(array) {
let i = 0
while(i < array.length) {
if(array[i] % 2 !== 0) {
return false
}
i++
}
return true
}
function log(value) {
console.log(checkEven(value))
}
log([2, 4, 6]) // true
log([1, 2, 3]) // false
log([2, 1, 2]) // false
log([1, 3, 5]) // false
Вот наглядный пример, где второй вариант работает очевидно быстрее первого (Лично у меня результаты отличаются примерно на 10 миллисекунд, в Node.JS'же показательны отличны друг от друга ещё больше):
let data = []
const elementsAmount = 1e7 // 1e7 === 10,000,000
for (let i = 0; i < elementsAmount; i++) {
data.push(2)
}
// data = [2, 2, 2, ... 2, 2, 2] (В массиве 10,000,000 элементов)
log(checkEven_every, data)
log(checkEven_while, data)
function log(fn, data) {
console.log(`Для выполнения функции ${fn.name} потребовалось ${timeRequired(fn, data)} миллисекунд.`)
}
function timeRequired(fn, data) {
let now = Date.now()
fn(data)
return Date.now() - now
}
function checkEven_every(array) {
return array.every(e => e % 2 === 0)
}
function checkEven_while(array) {
let i = 0
while (i < array.length) {
if (array[i] % 2 !== 0) {
return false
}
i++
}
return true
}