我遇到了一种奇怪的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' }]
有谁知道为什么会这样?
答案 0 :(得分:4)
您的.sort()
比较器功能不正确。当第一个值应在第二个值之前排序时,.sort()
比较器应该返回一个负数;第二个应该在第一个之前排序的正数;当它们被认为是用于订购目的的相同值时,它们为0。
您的比较器返回true
或false
,这将被解释为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了解更多信息