Если вы попали на этот материал, наверняка Вас интересует вопрос скорости перебора массива или вопрос о том, какой же все таки перебор использовать. Ниже приведена таблица скорости и инструментов итерации…
Итак, поехали.
Метод 1
Метод основывается на обходе циклом for как в языках C/C++, java и т.д.
for(var i = 0;i < arr.length; i++){
console.log(arr[i])
}
Измерения:
1ый этап | 114.3 ms |
2ой этап | 120.9 ms |
3ий этап | 116.0 ms |
4ый этап | 114.6 ms |
5ый этап | 111.4 ms |
Метод 2
Основывается на цикле while.
var index = 0;
while (index < arr.length) {
console.log(arr[index]);
index++;
}
1ый этап | 119.5 ms |
2ой этап | 114.7 ms |
3ий этап | 114.2 ms |
4ый этап | 121.0 ms |
5ый этап | 116.6 ms |
Метод 3
Основывается на методе foreach. Он вызывает необходимую фугкцию один раз для элемента массива по порядку.
arr.forEach(myFunction);
function myFunction(item, index)
{
console.log(item);
}
1ый этап | 117.7 ms |
2ой этап | 118.0 ms |
3ий этап | 113.0 ms |
4ый этап | 114.7 ms |
5ый этап | 108.8 |
Метод 4
Метод for in часто используется для обхода по объекту.
for(var item in arr){
console.log(arr[item])
}
1ый этап | 118.8 ms |
2ой этап | 107.9 ms |
3ий этап | 121.5 ms |
4ый этап | 111.1 ms |
5ый этап | 106.8 ms |
Метод 5
Метод for of синтаксис из es6 для обхода коллекций.
for (let value of arr) {
console.log(value); // 'a' 'b' 'c' 'd' 'e' 'f'
}
1ый этап | 114.3 ms |
2ой этап | 114.6 ms |
3ий этап | 107.7 ms |
4ый этап | 107.4 ms |
5ый этап | 106.2 ms |
Метод 6
Метод Map, используется для трансформации массива.
var new_items = items.map(function(key) {
return key.length;
});
1ый этап | 109.2 ms |
2ой этап | 113.6 ms |
3ий этап | 110.4 ms |
4ый этап | 109.7 ms |
5ый этап | 112.4 ms |
Метод 7
Метод Filter используется для фильтрации массива, например, когда нужно очистить от отрицательных чисел.
var positiveArr = arr.filter(function(number) {
return number > 0;
})
1ый этап | 114.6 ms |
2ой этап | 115.7 ms |
3ий этап | 117.9 ms |
4ый этап | 118.6 ms |
5ый этап | 117.0 ms |
Метод 8
Методы every/some используются для проверки массива.
var arr = [1, -1, 2, -2, 3];
function isPositive(number) {
return number > 0;
}
alert( arr.every(isPositive) ); // false, не все положительные
alert( arr.some(isPositive) ); // true, есть хоть одно положительное
1ый этап | 126.1 ms |
2ой этап | 117.2 ms |
3ий этап | 119.8 ms |
4ый этап | 120.2 ms |
5ый этап | 112.6 ms |
Итог скорости:
for of | 110.04 ms |
map | 110.7 ms |
for in | 113.22 ms |
forEach | 114.42 ms |
for(var i = 0;i < arr.length; i++) | 114.44 ms |
filter | 116.96 ms |
every/some | 119.18 ms |
while | 122.8 ms |
В заключение хочется сказать, что на самом деле скорость не сильно очевидная. Поэтому использовать инструмент можно смело тот, который Вам по душе. Но в погоне за скоростью можно выявить, что и как работает.
Надеюсь эта статья рассеит споры и мифы и даст объективный ответ тем, кто ищет ответ на вопрос о скорости итераторов и ленится сделать свой тест.
Тест я сохранил, можете найти его здесь: https://codepen.io/shmidtelson/pen/ebEmWa
Плагин рейтинга создан автором этого блога. Буду очень признателен, если вы сможете его поддержать (ссылка)