Подтвердить что ты не робот

Разница между find() и фильтром(). Shift() на javascript

Недавно я начал отбрасывать undererscore/lodash overuse (некоторые из) моих проектов и понимаю, что нет полной поддержки метода find в браузерах. Какая разница между методом ES6 find и использованием .shift() над filter результаты

var user = users.find(function() { ... } );

или

var user = users.filter(function() { ... } ).shift();

Я предполагаю, что существует очевидная оптимизация по методу "найти" (прекратить итерацию по совпадению), но могу ли я получить неожиданные результаты с использованием второго подхода? Должен ли я использовать polyfill вместо этого? Почему?

4b9b3361

Ответ 1

Помимо очевидных (и заметных) накладных расходов, да, результаты могут отличаться. filter выполняется до конца массива и вызывает его обратный вызов для каждого элемента; в отличие от find, который останавливается после его обнаружения. Когда обратный вызов вызывает исключение на одном из этих дополнительных элементов с повторением, результат отличается.
Я не вижу веских оснований не использовать find.

Ответ 2

Используйте polyfill; users.filter(function() { ... } ).shift(); отбрасывает циклы, вызывая ненужную сборку мусора.

  • filter сканирует весь массив и создает еще один массив
  • shift теперь необходимо изменить все индексы в массиве temp

Немного менее расточительный образец должен был бы использовать users.filter(function() { ... } )[0]