2015-06-08 6 views
2

У меня есть массив, который возвращается из API в формате [a, b, c, d, e, f ... ], где a,c,e и b,d,f имеют тот же тип, соответственно. Теперь я хочу сгруппировать массив в [ [a,b], [c,d], [e,f] ...]. Это довольно просто, создав новый массив, но массив большой, поэтому он может быть медленным.Быстрые элементы группы в массиве в javascript

Так что мне интересно, есть ли какие-либо методы, которые могут сделать это на месте?

+2

означает, что вы хотите сгруппировать их в 2-2 элементах. – Mritunjay

+1

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

+1

Вполне вероятно, что выполнение этого на месте в исходном массиве будет * медленнее *, чем создание нового массива. Изменение типа элементов массива «на лету» может помешать оптимизации массива. Для скорости лучше всего, чтобы все элементы в заданном массиве были одного типа. –

ответ

1

Вы хотите, чтобы это было в 2 разделе кусков?

var o = ['a', 'b', 'c', 'd', 'e', 'f'], 
    size = 2, i, ar = []; // The new array 

for (i = 0; i < o.length; i += size) ar.push(o.slice(i,i + size)); 

Теперь, ар есть:

[ 
    ['a', 'b'], 
    ['c', 'd'], 
    ['e', 'f'] 
] 

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

Тесты скорости

Так я создам массив с этим:

var l = 10000000, // The length 
    o = [], j; 
for (j = 0; j < l; j += 1) o.push(j); 

Так что сделает массив с l пунктов сейчас, чтобы проверить скорость:

var start = performance.now(), 
    size = 2, ar = []; 
for (i = 0; i < o.length; i += size) ar.push(o.slice(i,i + size)); 
console.log(performance.now() - start); 

Тесты:

100 тысяч: +0,092909533996135 секунд

1 миллион: +0,359059600101318 секунд

10 миллионов: +10,138852232019417 секунд

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

1

Это бессмысленное использование библиотеки, даже если оп обеспокоен производительности, но я люблю использовать lodash/подчеркивание для легко понятного кода:

_.partition('a,b,c,d,e,f'.split(','), function(_, idx) {return !(idx % 2);}) 
+0

Проблема в том, что вся новая библиотека не очень эффективна с точки зрения скорости – Downgoat

1

на месте решение просто перебирать, как обычно, строить массивы и «пропускать» элементы, сплавляя их, прежде чем вы их достигнете.

DEMO

var arr = ['a', 'b', 'c', 'd', 'e', 'f']; 
 

 
function compact (arr) { 
 
    for(var i = 0; i < arr.length; i++) { 
 
    arr[i] = [arr[i], arr[i + 1]]; 
 
    arr.splice(i + 1, 1); 
 
    } 
 
    
 
    return arr; // debug only 
 
} 
 

 
console.log(compact(arr.slice())); 
 
// >> [["a", "b"], ["c", "d"], ["e", "f"]]

Непроверено, насколько производительность идет. Я согласен с комментариями, что, скорее всего, медленнее манипулировать массивом на месте, поскольку это связано с созданием нового массива.

Смежные вопросы