Могу ли я использовать «карту» вместо «для каждого» / «для в»? - PullRequest
4 голосов
/ 23 апреля 2010

В течение некоторого времени JavaScript имеет функцию "map" для циклического перебора массивов.

Возможно использовать его как оператор foreach, например:

fruitbowl.map(function(fruit){ 
                  ... do stuff with fruit
              })

Это лучше или хуже, чем сказать

for(var i in fruitbowl){ 
     ... do stuff with fruitbowl[i] 
}

Сохраняет необходимость использования индекса, но добавляет обратный вызов; это не кажется распространенным, поэтому я не решаюсь его использовать, но все же хочу.

Ответы [ 5 ]

7 голосов
/ 23 апреля 2010

Три упомянутых вами метода имеют разные цели.

Цель метода Array.prototype.map - создать новый массив с результатами вызова функции обратного вызова для каждого элемента массива.

Цель метода Array.prototype.forEach - выполнить итерацию по массиву, выполнив предоставленную функцию обратного вызова один раз для каждого элемента массива.

Цель оператора for...in состоит в том, чтобы перечислить свойства объекта .

Я думаю, что следует избегать оператора for...in для обхода любого подобного массиву объекта 1 , где реальная цель повторять по числовым индексам, а не перечислять свойства объекта (даже зная, что эти индексы являются свойствами).

Причины, по которым for...in следует избегать повторения массивоподобных объектов:

  • Итерация по наследуемым определяемым пользователем свойствам в дополнение к элементам массива, если вы используете библиотеку, например MooTools, которая расширяет объект Array.prototype, вы увидите все эти расширенные свойства.
  • Порядок итерации произвольный, элементы нельзя посещать в числовом порядке.

Посмотрите на эту статью:


1 Под массивоподобными объектами я подразумеваю любой объект, который содержит последовательные числовые свойства и свойство length

3 голосов
/ 23 апреля 2010

Использование считается действительным, но это плохой стиль - использовать операцию карты исключительно для побочных эффектов.

1 голос
/ 23 апреля 2010

Не используйте map для его побочных эффектов.Если ваша задача заключается в переборе массива, чтобы что-то сделать с каждым объектом, используйте foreach.Если вы отображаете значения, например, экранируете массив строк, используйте map.Нет ничего лучше ясности и стремления программиста быть умным.

1 голос
/ 23 апреля 2010

В Perl карта используется аналогично, но более естественно.

Мое эмпирическое правило: если он не читает лучше, чем цикл, не используйте егоСложно отлаживать.Но для определенных функций отображение более естественно, чем цикл.Если вам нужно почесать голову - не делайте этого.Пожалейте парня, который следует за вами, включая вас самих, через некоторое время!

1 голос
/ 23 апреля 2010

Читаемость стоит много. Карта может сбить с толку тех, кто никогда не видел ее, используя этот способ. Это нарушает «принцип наименьшего удивления».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...