Вольный перевод этой статьи: medium.com/poka-techblog/simplify-your-javascript-use-some-and-find
В JavaScript есть много методов упрощения существующего кода. EcmaScript развивается, и даёт возможность писать код «более лучше», чем это позволял, к примеру, ES5. Давайте рассмотрим несколько методов для работы с массивами.
some
Этот метод позволяет определить, удовлетворяет ли хотя бы один элемент массива заданному условию. Давайте рассмотрим это на примере.
Допустим, у нас есть массив товаров, и нужно определить, есть ли среди них один или несколько товаров со скидкой.
const goods = [
{ id: 1, name: 'Пельмени', hasDiscount: false },
{ id: 2, name: 'Шоколадка', hasDiscount: false },
{ id: 3, name: 'Пиво', hasDiscount: true },
];
Достичь цели можно несколькими способами. Раньше был популярен следующий метод:
let listHasDiscount = false;
goods.forEach((good) => {
if (good.hasDiscount) {
listHasDiscount = true;
}
});
Но сейчас это можно реализовать более лаконично и читабельно:
const listHasDiscount = goods.some(good => good.hasDiscount);
Ого, пиво по скидке, дайте два.
Как это работает?
В функцию some передаётся функция-аргумент. Эта функция-аргумент запускается для каждого элемента массива и возвращает булевое значение. Как только функция-аргумент вернёт true, обход массива завершится и функция some вернёт true. В противном случае функция some вернёт false.
every
Эта функция работает по тому же принципу, что и some, но возвращает true только тогда, когда функция-аргумент вернула true для каждого элемента массива.
Для этого примера функция вернёт false, так как 2 товара не удовлетворяют условию.
const listHasDiscount = goods.some(good => good.hasDiscount);
find
Эта функция возвращает первый элемент массива, удовлетворяющий условию, или undefined в противном случае.
Как раньше искали нужный элемент в массиве, особенно объект (со скалярными типами всё-таки проще)? Да, с помощью forEach.
let good;
goods.forEach((currentGood) => {
if (currentGood.id === 1) {
good = currentGood;
}
});
Вернёмся к нашему списку товаров. Таким образом можно найти товар с нужным id:
const good = goods.some(good => good.id === 1);
Вывод
Использование методов find, some и every по сравнению с обычными циклами делает код лаконичнее, читабельнее.