簡體   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