Привет .
Я Михаил, fullstack-разработчик, занимаюсь интернет-проектами: от сайтов до систем автоматизации.
Отправить мне сообщение

Упростите код на JavaScript – используйте some, every и find

Вольный перевод этой статьи: 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 по сравнению с обычными циклами делает код лаконичнее, читабельнее.