В JavaScript есть несколько методов Array, например forEach (), indexOf (), map (), reduce ()… Но сегодня я хочу показать вам (если вы их не знаете) три метода, которые кажутся менее часто используемыми для запроса массива «без цикла». Я заключил это в кавычки, потому что это не совсем так: вы не делаете цикл, но внутри цикл создается.

Приступим к делу: some (), every () и find ()

  1. НЕКОТОРЫЕ ()

Этот метод определяет, есть ли в вашем массиве одно или несколько значений, и возвращает false или true в зависимости от того, совпадают ли значения. Но лучше показать пример:

Представьте, что у вас есть клиенты, и вы хотите отправить электронное письмо только тем, у кого есть домашние животные:

const clients = [
  { id: 1, name: 'Sheldon Cooper', pet: false, age: 12 },
  { id: 2, name: 'Leonard Hofstadter', pet: false, age: 32 },
  { id: 3, name: 'Raj Koothrappali', pet: true, age: 31 },
  { id: 4, name: 'Howard Wolowitz', pet: false, age: 33 },
]

Чтобы узнать, есть ли у какого-либо клиента домашнее животное и не использовать цикл, вы обязательно должны использовать forEach (), и ваш код будет примерно таким:

let hasPet = false;
clients.forEach(client => {
  if ( client.pet ) {
    hasPet = true; 
  } 
}) // true

Но вы можете получить тот же результат с меньшим количеством строк, используя some ():

let hasPet = clients.some(client => client.pet); // true

ПРИМЕЧАНИЕ!

Some () прекращает итерацию по массиву, как только находит элемент, соответствующий условию. Если он находит элемент, соответствующий условию, он автоматически возвращает true, не проверяя оставшиеся элементы. В моем примере выше some () запускается 3 раза, потому что «Радж Кутраппали» имеет питомца (true).

И, если все результаты возвращают false, some () вернет false.

2. КАЖДЫЙ ()

Слишком похоже на some () - это every (). Эта функция также используется для поиска, если какое-либо значение соответствует условию. НО разница в том, что every () вернет истину только в том случае, если каждое вхождение совпадает. Таким образом, мы можем сказать, что every () выполняет поиск, если КАЖДЫЙ элемент соответствует условию.

Следуя приведенному выше примеру, я заменю some () на every ():

let hasPet = clients.every(client => client.pet); // false

Вы можете использовать его, например, если хотите отправить электронное письмо всем клиентам, достигшим совершеннолетия, и ваш код будет примерно таким:

const legalAge = clients.every(client => client.age > 18);
if( legalAge ) {
  sendEmail()
}

И, как и some (), выполнение every () останавливается, как только every () находит элемент массива, который не соответствует condition и автоматически возвращает false и не выполняет итерацию по оставшимся элементам.

3. НАЙТИ ()

Этот метод делает то, что он говорит: находит то, что вы ищете, в массиве. Он возвращает первое значение, удовлетворяющее определенному условию. Если нет значения, удовлетворяющего условию, возвращается undefined.

Он очень похож на every () и some (), разница в том, что эти методы возвращают логическое значение, а find () вместо возврата логическое значение, он вернет весь элемент в вашем массиве.

Всегда лучше увидеть пример. Следуя нашему массиву clients, мы хотим узнать, есть ли человек с возрастом менее 18 лет.

// some()
let legalAgeSome = clients.some(client => client.age < 18); 
// true
// every()
let legalAgeEvery = clients.every(client => client.age < 18); 
// false
// find()
let legalAgeFind = clients.find(client => client.age < 18); 
// {id: 1, name: "Sheldon Cooper", pet: false, age: 12}

ПРИМЕЧАНИЕ!

Как я уже сказал, он вернет только первое совпадение, поэтому, если вам нужны все значения, соответствующие вашему условию, вы должны использовать filter () вместо find (). Например, мы хотим видеть всех в нашем массиве, достигших совершеннолетия:

// filter()
let legalAgeFilter = clients.filter(client => client.age > 18); 
// 0: {id: 2, name: "Leonard Hofstadter", pet: false, age: 32}
1: {id: 3, name: "Raj Koothrappali", pet: true, age: 31} 
2: {id: 4, name: "Howard Wolowitz", pet: false, age: 33}

Чтобы увеличить объем, используйте some (), every () и find () вместо for () или forEach () не только делает ваш код короче, но и делает его более понятным, где ваши намерения лучше видны.