2013-11-11 2 views
-2

мне нужно обрабатывать большой список объектов (в том случае, спрайты в игре) в определенном порядке, определяется одним из их имущества (в том случае, zIndex из спрайт). Я приобретаю объекты поочередно, в случайном порядке, но не так далеко от идеального.Рассортирована большой список объектов

На данный момент я наивно наивно каждого объекта, который я приобретаю в массиве, и сортирую его перед операцией (с фильтром orderBy AngularJS). Но операция очень медленная (50% от общего времени вычисления). Что я могу сделать, чтобы ускорить процесс?

Я пытаюсь использовать разреженный массив, ключами которого являются zIndex моих объектов, но по загадочной причине:

  • angular.forEach очень медленно на разреженный массив,
  • заказ Безразлично Кажется, что сохраняется, когда я перебираю массив с помощью цикла for ... in.

ответ

1

Как насчет использования array.sort(). Чем ближе вы доберетесь до исходного браузера JavaScript, тем быстрее вы его получите.

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

+0

Whao! Я не ожидал такой впечатляющей разницы между 'angular.orderBy' и' Array.sort'! Самое простое решение всегда самое лучшее, я полагаю ... Спасибо за ваш простой, но эффективный ответ :). – Blackhole

0

Я не хотел бы использовать for ... in петлю. С Mozilla: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

Iterates over the enumerable properties of an object, in arbitrary order.

for ... in обычно перебрать массив в порядке, что свойства массива были определены, поэтому сортировка не работает. Не уверен, что он решит вашу проблему, но выполнение var i = 0, l = items.length; for (; i < l; i++) { // do stuff } сохранит порядок массивов и, скорее всего, будет самым быстрым способом, так как использует собственный JavaScript.

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

+0

Но это подразумевает итерацию по всем ключам (очень) разреженного массива (так как 'zIndex' вовсе не являются целями), что приведет к огромным накладным расходам, нет? Возникает вопрос: как я могу перебирать только определенные значения массива и сохранять порядок во время операции? – Blackhole

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