繁体   English   中英

在Chrome中使用Array.prototype.sort时对数组进行奇怪的排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM