![](/img/trans.png)
[英]What's the sorting algorithm when using Array.prototype.sort() with a compare function
[英]Strange sorting of array when using Array.prototype.sort in Chrome
在数字数组上使用Array.prototype.sort()
时,我发现了一个奇怪的地方,我不确定是什么原因造成的。
我的目标是使用sort
反转数组(不使用reverse
),因此我可以像这样链接它:
const shouldReverse = Math.random() > 0.5,
result = foo().bar().map(...).reverseIf(shouldReverse);
我相信我应该能够使用sort
实现此功能,在某些情况下似乎可行,但在其他情况下则行不通。
这是一个工作示例:
const myArray = ['a', 'b', 'c', 'd'],
mySortedArray = myArray.sort(() => 1);
console.log(mySortedArray);
["d", "c", "b", "a"]
还有一个不起作用的例子:
const myArray = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'],
mySortedArray = myArray.sort(() => 1);
console.log(mySortedArray);
["f", "k", "a", "j", "i", "h", "g", "b", "e", "d", "c"]
这仅在Chrome中发生,并且仅在数组中包含10个以上的元素时发生-这可能是Chrome V8引擎中的某种形式的优化吗?
我相信我应该能够使用
sort
实现
不,你不应该。 您正在寻找reverse
。
对于已经按升序排序的特定示例,可以通过传递导致降序的比较函数来实现逆转,但这不适用于具有任意值的任意数组。
myArray.sort((a, b) => (a<b)-(b<a));
myArray.sort(() => 1)
那是一个完全不一致的比较功能 。 您不能指望它能起作用。
仅在Chrome中且仅在数组中包含10个以上元素时才会发生这种情况
这是因为Chrome中的JS引擎对小数组使用了不同的排序算法,该算法以不同的顺序进行比较,并且显然总是与第二个参数中索引较高的项目进行比较。 你真幸运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.