javascript`localeCompare`返回不同的值

时间:2015-03-17 13:14:43

标签: javascript arrays string sorting native

我现在使用javascript进行string localeCompare排序,我的数据也会包含多个null值。

在比较localeComparestring值时,我发现null有一种奇怪的行为。将字符串值与a/A to n/N的字符串值进行比较时,它可以正常工作,如下所示。

"n".localeCompare(null) // return -1;
"N".localeCompare(null) // return -1;

但如果我将空值与o/O to z/Z进行比较,则返回1

"o".localeCompare(null) // return 1;
"O".localeCompare(null) // return 1;

我知道localeCompare可以用来比较Unicode,但为什么上述行为发生有什么原因?

2 个答案:

答案 0 :(得分:3)

localeCompare比较字符串,因此传递给它的任何内容都将转换为字符串,您将从

获得相同的结果
"n".localeCompare("null") // return -1;
"o".localeCompare("null") // return 1;

因为

  

localeCompare()方法返回数字,表示是否   引用字符串位于之前或之后,或者与给定字符串相同   按排序顺序排列。

MDN

表示

"null".localeCompare("null") - >将返回0,因为它是相同的字符串
"n".localeCompare("null") - >将在-1之前返回null "o".localeCompare("null") - >将在1

之后返回null

答案 1 :(得分:0)

如果您想要一个可以处理null

的真实比较器

然后,你最好实现这样的事情,

function stringComparer(a,b) {
  if(a && b)
    return a.localeCompare(b);
  else 
    // sort null and "" to bottom
    if(a)
      return -1;
    else if(b)
      return 1;
    else 
      return 0;
}

并使用它来比较您的值。这是一个例子,

['Łove','Love',null,"",null,'kellogs','Kellogs','kellogs',null,"Lover","   ",'Man',"abc", "AAb", "Abc"].sort(stringComparer)

根据您希望null,“”和“”值如何相互排序,还有一些改进空间的空间。在上面的实现中,“”将排序到顶部,而null和“”值将排序到底部。