В JavaScript есть несколько методов Array, например forEach (), indexOf (), map (), reduce ()… Но сегодня я хочу показать вам (если вы их не знаете) три метода, которые кажутся менее часто используемыми для запроса массива «без цикла». Я заключил это в кавычки, потому что это не совсем так: вы не делаете цикл, но внутри цикл создается.
Приступим к делу: some (), every () и find ()
- НЕКОТОРЫЕ ()
Этот метод определяет, есть ли в вашем массиве одно или несколько значений, и возвращает 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 () не только делает ваш код короче, но и делает его более понятным, где ваши намерения лучше видны.