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

Карта JQuery против Javascript map vs For-loop

Я реализую некоторый код, который естественным образом подходит для карты. Тем не менее, у меня есть значительное количество объектов в списке, который я собираюсь перебирать, поэтому мой вопрос заключается в том, что это лучший способ сделать это:

var stuff = $.map(listOfMyObjects, someFunction())

var stuff = listOfMyObjects.map(someFunction())

или просто

var stuff = new Array(); 
for(var i = 0; i < listOfmyObjects.length; i++){
    stuff.push(someFunction(listOfMyObjects[i]));
}
4b9b3361

Ответ 1

Последний (для цикла) намного быстрее. Я помню, где-то был где-то ориентир, но я не могу найти ссылку.

Если производительность действительно проблема, я бы использовал цикл for. Это не очень затмевает код.

Ответ 2

вот тестовый пример, выполненный в jsben.ch: http://jsben.ch/#/BQhED

это показывает, что карта for-loop быстрее, чем карта jquery (по крайней мере, в хроме).

Ответ 3

Во-первых, true Objects не имеет встроенного метода .map(), а не свойства .length. Поэтому мы говорим о Arrays или Array-like-objects (например, объекты jQuery).

Однако не существует более быстрого способа повторения, чем использование встроенного цикла for, while или do-while. Все другие функциональные операции выполняют (угадайте, какая) функция для каждой итерации, которая стоит.

jQuerys .each() будет просто выполнять цикл for-in, когда объект передается ему. Это довольно быстрый способ перебора объекта. Вы можете просто использовать for-in самостоятельно и сохранить служебный вызов.

Другим "хорошим" способом с точки зрения удобочитаемости является использование функций ES5, таких как .keys() и .map(). Например:

var myObj = {
    foo:  'bar',
    base:  'ball',
    answer: 42,
    illuminati: 23
};

Object.keys( myObj ).map(function( prop ) {
    console.log( myObj[ prop ] );
});

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

Но опять-таки, никоим образом не побить собственные петли с точки зрения производительности.

Ответ 4

+1 для ответа "test it" от Эмиля:) Это всегда правильный ответ.

Но да, нативные петли выигрывают, и вы можете сделать это лучше, кэшируя длину, поэтому ссылка .length не оценивается на каждой итерации.

for(var i = 0, l = list.length; i < l; i++)

или избегайте дополнительного var, делая это назад

for(var i = list.length-1; i >= 0; i--)

И если вы можете "встроить" "someFunction", это будет еще быстрее. В принципе, избегайте вызовов функций и ссылок в максимально возможной степени. Но это только если вы действительно смотрите на мелкие детали. Это маловероятно, что такие оптимизации будут иметь большое значение. Всегда проверяйте свои узкие места.

Ответ 5

Создайте тестовые примеры с кодом html/javascript на jsperf.

Вы сможете увидеть, что лучше всего работает, и как быстро разные браузеры выполняют циклы.

Я бы поместил свои деньги в собственный JavaScript-цикл, но вы никогда не знаете.