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)
Вывод. Задание не сложное, но проектом это назвать нельзя. Обычные задачи на массивы.
Решение автора хорошее.