为什么 .sort() 在按字母顺序对某些数组进行排序时表现不正确?

Dan*_*tiz 0 javascript arrays sorting

我遇到了一个奇怪的 JavaScript 行为。如果我尝试使用 进行排序 ['a', 'b','c', 'd', 'e', 'f', 'g', 'h','i', 'j'][].sort((a, b) => a > b)它会返回正确排序的数组(在本例中,与之前完全相同),但如果我向数组中添加一项,例如:

['a', 'b','c', 'd', 'e', 'f', 'g', 'h','i', 'j', 'k'].sort(
  (a, b) => a > b
)
Run Code Online (Sandbox Code Playgroud)

它返回:

["f", "a", "b", "c", "d", "e", "g", "h", "i", "j", "k"]

奇怪的是,如果我将“l”添加到数组中,它会返回:

["g", "a", "b", "c", "d", "e", "f", "h", "i", "j", "k", "l"] (“f”现在位于正确的位置,但“g”不是 oO)

如果我.sort在不提供比较器的情况下使用该方法,它会正确排序,但这对我来说没有用,因为我实际上是在尝试按属性对对象数组进行排序,例如:

[{ firstName: 'Peter' }, { firstName: 'Alfred' }]

有谁知道为什么会发生这种情况?

Poi*_*nty 5

您的.sort()比较器功能不正确。当第一个值排序在第二个值之前时,比较.sort()器应返回负数;当第二个应该排序在第一个之前时为正数;和 0 时,出于订购目的应将它们视为相同的值。

您的比较器返回trueor false,它将被解释为 1 或 0。因此,当a小于 时b,您的比较器告诉.sort()它与相同b

字符串有一个方便的方法,非常适合排序:

['world', 'hello'].sort((a, b) => a.localeCompare(b));
Run Code Online (Sandbox Code Playgroud)

对数字进行排序时,只需返回减法运算的结果即可。