2014-02-18 5 views
5

Например, я типизированный массив, как это:Как отсортировать типизированные массивы в javascript?

var a = new Int32Array([3,8,6,1,6,9]); 

Когда я пытаюсь вызвать a.sort(), он не работает.

Каков наилучший способ сортировки типизированных массивов? Что касается производительности, можем ли мы сортировать типизированные массивы быстрее, чем обычные массивы?

+2

Вы пробовали '[] .sort.call (а)'? –

+2

@Felix Kling:^ответ (я бы предпочел использовать 'Array.prototype.call' хотя) – zerkms

+0

ES6 представил' TypedArray.prototype.sort': http://stackoverflow.com/a/37684611/1647737 –

ответ

5

Методы массива JavaScript определены таким образом, что они применимы к любому объекту типа, а не только к фактическим экземплярам Array. Таким образом, вы можете использовать:

Array.prototype.sort.call(a, function(a, b) { return a - b; }); 

Обычай обратного вызова необходимо потому, что JS сортирует значения лексикографически по умолчанию. См. Также How to sort an array of integers correctly.

+0

У меня есть сравнение сортировки типизированного массива таким образом и регулярного массива. Кажется, у него нет существенной разницы в скорости. Почему это? Разве он не должен сортировать типизированный массив быстрее обычного массива? – Luka

+1

@dartfish 'Array.prototype.sort' сам по себе крайне медленный из-за [непристойной семантики, которую необходимо реализовать] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.4.11). Вам лучше реализовать специализированный сорт, если у вас есть небольшая озабоченность по поводу производительности. – Esailija

1

Спецификация языка ECMAScript 2015 введена .sort() method for typed arrays.

var a = new Int32Array([3, 8, 6, 1, 6, 9]); 
 
console.log(a.sort()); // [1, 3, 6, 6, 8, 9]

Есть некоторые различия хотя, д. г. относительно функции сравнения по умолчанию:

[TypedArray.prototype.sort] выполняет численное сравнение, а не сравнение строк, используемое в [Array.prototype.sort].

console.log(new Array([1, 10, 2]).sort()); // [1, 10, 2] 
 
console.log(new Int32Array([1, 10, 2]).sort()); // [1, 2, 10]

+0

Это полезно знать. Благодаря! – Luka

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