JS30. Задание 7 Array Cardio Day 2

Второй день работы с массивами.
Разбираем методы
Array.prototype.some()
Array.prototype.every()
Array.prototype.find()
Array.prototype.findIndex()

Array.prototype.some()


Метод some() проверяет, удовлетворяет ли хоть какой-нибудь элемент массива условию, заданному в передаваемой функции. Метод some() вызывает переданную функцию callback один раз для каждого элемента, присутствующего в массиве до тех пор, пока не найдет такой, для которого callback вернет истинное значение

Пример: проверка значений элементов массива

Следующий пример проверяет, существует ли в массиве какой-нибудь элемент, больший 10.

function isBiggerThan10(element, index, array) {
return element > 10;
}
[2, 5, 8, 1, 4].some(isBiggerThan10);  // false
[12, 5, 8, 1, 4].some(isBiggerThan10); // true

Пример: проверка элементов массива с использованием стрелочных функций

Стрелочные функции предоставляют более краткий синтаксис для подобных проверок.

[2, 5, 8, 1, 4].some(elem => elem > 10);  // false
[12, 5, 8, 1, 4].some(elem => elem > 10); // true

У нас есть массив

const people = [
      { name: 'Wes', year: 1988 },
      { name: 'Kait', year: 1986 },
      { name: 'Irv', year: 1970 },
      { name: 'Lux', year: 2015 }
    ];


Нужно выяснить, есть ли хоть одному из них 19 лет или больше, другими словами, является ли хоть одно значение year 1998 (2017 - 19) или меньше

Если бы задача стояла получить все значения year из массива, мы бы её выполнили так:

var arr = [];
people.forEach(date => arr.push(date.year));

Дополним код методом some()

var arr = [];
people.forEach(date => arr.push(date.year));
arr.some(age => age < (2017 - 19)); // true

Вот так я решать умею.
Есть подозрение, что весь код можно было бы и в одну строку поместить, примерно так

people.forEach(date => arr.push(date.year)).some(age => age < (2017 - 19)); // ошибка.

Посмотрим, какое решение предлагает автор

    const isAdult = people.some(person => ((new Date()).getFullYear()) - person.year >= 19);

    console.log({isAdult});

Безусловно, его решение намного лучше

Во-первых, вместо непостоянного 2017, который через несколько месяцев станет 2018, он использует (new Date()).getFullYear(), которая всегда вернёт актуальный год.
Во-вторых, он не создавал никаких дополнительных массивов arr. а применил метод some() сразу к исходному массиву
И вывод результата понравился  console.log({isAdult});
Этот код выведет следующее {isAdult: true} - сразу и переменная и её значение
Круто, да

Array.prototype.every()


Второй вопрос к этому же заданию.
Являются ли все люди старше 19 лет?
Здесь используем метод Array.prototype.every(), который проверит все элементы массива и выведет true только если все они соответствуют условию

Моё решение

const isEveryAge = people.every(person => (new Date()).getFullYear() - person.year >= 19);

console.log({isEveryAge});

Сработало )
В консоли Хрома. А в Firefox - ошибка

Оказывается, в Хроме тоже ошибка, если запустить код во второй раз.
Мне кажется, проблема в константах, которые здесь используются и с переменными var ошибки не будет. Проверяю. Да, так и есть. В Хроме ошибка при повторном запуске исчезла. В Firefox тоже, правда, в нём у меня и console.log не работает, но если выполнить isEveryAge, ответ в консоли появляется.

Array.prototype.find()

const comments = [
      { text: 'Love this!', id: 523423 },
      { text: 'Super good', id: 823423 },
      { text: 'You are the best', id: 2039842 },
      { text: 'Ramen is my fav food ever', id: 123523 },
      { text: 'Nice Nice Nice!', id: 542328 }
    ];

Задание изменилось. Теперь у нас есть список комментариев и их id.

Метод find() возвращает значение в массиве, если элемент удовлетворяет условию проверяющей функции. В противном случае возвращается undefined.Также смотрите метод findIndex(), который возвращает индекс найденного в массиве элемента вместо его значения. источник

 Задание - найти комментарий у которого id = 823423
Я думаю, решение может выглядеть так

comments.find(comment => comment.id == 823423);

Работает. Смотрим решение автора

const comment = comments.find(comment => comment.id === 823423);

console.log(comment);

Вместо двойного равно использовал тройное, в данном случае не принципиально, и присвоил результат переменной.

Array.prototype.findIndex()

Следующее задание - найти индекс комментария с id = 823423

comments.findIndex(comment => comment.id === 823423); // 1

И удалить его
Здесь нужно помнить, что обычный delete удаляет комментарий, но оставляет в массиве пустое место

delete comments[1] вернёт массив из пяти элементов, только на месте второго будет undefined

А вот так удалит один элемент начиная с первой позиции

comments.splice(1, 1)

Вывод. Задание не сложное, но проектом это назвать нельзя. Обычные задачи на массивы.
Решение автора хорошее.