如何在JavaScript中对已输入的数组进行排序?

6
例如,我有一个像这样的数组:
var a = new Int32Array([3,8,6,1,6,9]);

当我尝试调用a.sort()时,它无法工作。

对于排序类型数组,最好的方法是什么? 关于性能方面,我们能否比普通数组更快地对类型数组进行排序?


2
你尝试过 [].sort.call(a) 吗? - Felix Kling
2
@Felix Kling: ^ 这个答案(我更倾向于使用Array.prototype.call - zerkms
1
ES6 引入了 TypedArray.prototype.sort:https://dev59.com/pXzaa4cB1Zd3GeqPSJxt#37684611 - le_m
2个回答

6

JavaScript数组方法的定义方式使它们适用于任何“类似数组”的对象,而不仅仅是实际的Array实例。因此,您可以使用以下内容:

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

自定义回调函数是必要的,因为JS默认按字典顺序对值进行排序。另请参见如何正确地对整数数组进行排序


我已经比较了这种方式和常规数组的排序。速度上似乎没有任何显著差异。为什么会这样?难道不应该使用类型化数组比常规数组更快吗? - Luka
1
@dartfish Array.prototype.sort 本身由于需要实现令人讨厌的语义,而非常缓慢。如果您对性能有一点关注,最好自己实现一个专门的排序。 - Esailija

3
ECMAScript 2015语言规范引入了一种 .sort()方法用于类型化数组

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]


那个引用出自哪里?MDN页面没有提到,除了示例代码中的注释(这几乎不是规范的一部分)。 - riv
@riv 这是来自链接规范的内容,在第22.2.3.25节下 - http://www.ecma-international.org/ecma-262/6.0/#sec-%25typedarray%25.prototype.sort - le_m

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接