Функция, которая принимает массив чисел, которая возращает истинну, если все элементы четные, если бы хотя бы один элемент не четный, то false

Рейтинг: 0Ответов: 1Опубликовано: 03.04.2023

Написал код, но понимаю, что перебор 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Принят

Может быть вот так?

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
}