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

时间:2017-02-13 20:28:29

标签: 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
)

它返回:

["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'不是o.O)

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

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

有谁知道为什么会这样?

3 个答案:

答案 0 :(得分:4)

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

您的比较器返回truefalse,这将被解释为1或0.因此当a小于b时,您的比较器会告诉.sort()它与<{1}} 相同

字符串有一个方便的方法可用于排序:

b

排序数字时,您只需返回减法运算的结果。

答案 1 :(得分:0)

如果&lt;比较函数应返回负数。 b,如果a = b则为0,如果a> b则为正数。 b,所以看起来应该是这样的:

spark.sqlContext.udf.register("dayToInt", (dayOfWeek:String) => {
    dayOfWeek.toLowerCase() match {
        case "sunday"    => 1
        case "monday"    => 2
        case "tuesday"   => 3 
        case "wednesday" => 4
        case "thursday"  => 5
        case "friday"    => 6
        case "saturday"  => 7
    }
})

答案 2 :(得分:-1)

sort()函数将使用compareFunction指定排序顺序。如果省略,则根据每个元素的字符串转换,根据每个字符的Unicode代码点值对数组进行排序。

尝试使用以下内容:

function compareNumbers(a, b) {
  return a - b;
}

查看https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort了解更多信息