Какой самый быстрый способ перебрать массив в JavaScript? - PullRequest
221 голосов
/ 18 марта 2011

Я узнал из книг, что вы должны написать для цикла, как это:

for(var i=0, len=arr.length; i < len; i++){
    // blah blah
}

, поэтому arr.length не будет рассчитываться каждый раз.

Другие говорят, что компилятор сделает некоторую оптимизацию для этого, так что вы можете просто написать:

for(var i=0; i < arr.length; i++){
    // blah blah
}

Я просто хочу знать, какой способ лучше всего применять на практике?

Ответы [ 22 ]

4 голосов
/ 22 мая 2017

Это год 2017 .

Я провел несколько тестов.

https://jsperf.com/fastest-way-to-iterate-through-an-array/

Похоже, метод while самый быстрыйв Chrome.

Похоже, что левый декремент (--i) намного быстрее других (++i, i--, i++) в Firefox.

Этот подходпостился в среднем.Но он повторяет массив в обратном порядке.

let i = array.length;
while (--i >= 0) {
    doSomething(array[i]);
}

Если важен прямой порядок, используйте этот подход.

let ii = array.length;
let i = 0;
while (i < ii) {
    doSomething(array[i]);
    ++i;
}
2 голосов
/ 18 марта 2011

Я всегда пишу в первом стиле.

Даже если компилятор достаточно умен, чтобы оптимизировать его для массивов, но все же он умен, если мы используем DOMNodeList здесь или какой-то сложный объект с вычисленной длиной?массивов, но я думаю, что это хорошая практика, чтобы написать все ваши циклы в одном стиле.

1 голос
/ 24 июля 2014
var arr = []; // The array
var i = 0;
while (i < arr.length) {
    // Do something with arr[i]
    i++;
}

i ++ быстрее, чем ++ i, --i и i -

Кроме того, вы можете сохранить последнюю строку, выполнив arr [i ++] в последний раз, когда вам нужно получить доступ к i (ноэто может быть трудно отладить).

Вы можете проверить это здесь (с другими тестами цикла): http://jsperf.com/for-vs-whilepop/5

0 голосов
/ 18 июля 2018

Попробуйте это:

var myarray =[],
i = myarray.lenght;
while(i--){
// do somthing
}
0 голосов
/ 14 апреля 2018

Хотя цикл немного быстрее, чем для цикла.

var len = arr.length;
while (len--) {
    // blah blah
}

Используйте цикл while вместо

0 голосов
/ 05 января 2013

Самое элегантное решение, которое я знаю, это использование карты.

var arr = [1,2,3];
arr.map(function(input){console.log(input);});
0 голосов
/ 08 ноября 2017

Основной цикл while часто самый быстрый. jsperf.com - отличная песочница для тестирования подобных концепций.

https://jsperf.com/fastest-array-loops-in-javascript/24

0 голосов
/ 18 сентября 2017

По состоянию на сентябрь 2017 года эти тесты jsperf показывают, что следующий шаблон наиболее эффективен в Chrome 60:

function foo(x) {
 x;
};
arr.forEach(foo);

Кто-нибудь умеет размножаться?

0 голосов
/ 08 ноября 2014

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

var firstHalfLen =0;
var secondHalfLen = 0;
var count2=0;
var searchterm = "face";
var halfLen = arrayLength/2;
if(arrayLength%2==halfLen)
{
   firstHalfLen = Math.ceil(halfLen);
   secondHalfLen=Math.floor(halfLen);
}
else
{
   firstHalfLen=halfLen;
   secondHalfLen=halfLen;
}
for(var firstHalfCOunter=0,secondHalfCounter = arrayLength-secondHalfLen;
    firstHalfCOunter < firstHalfLen;
    firstHalfCOunter++)
{
  if(mainArray[firstHalfCOunter].search(new RegExp(searchterm, "i"))> -1)
  {
    count2+=1;
  }
  if(secondHalfCounter < arrayLength)
  {
    if(mainArray[secondHalfCounter].search(new RegExp(searchterm, "i"))> -1)
    {
        count2+=1;
    }
    secondHalfCounter++; 
  }
}

Некоторое сравнение производительности (с использованием timer.js) между кешированной длиной цикла for VS вышеуказанным методом.

http://jsfiddle.net/tejzpr/bbLgzxgo/

0 голосов
/ 22 октября 2018

Более быстрый способ создания цикла в массиве - использование фильтра. Метод filter () создает новый массив со всеми элементами, которые проходят тест, реализованный предоставленной функцией.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

const words = ['Floccinaucinihilipilification', 'limit', 'elite', 'Hippopotomonstrosesquipedaliophobia', 'destruction', 'present'];

const result = words.filter(word => word.length > 6);

console.log(new Date(), result);

Исходя из своего опыта, я всегда предпочитаю фильтры, карты и т. Д.

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