javascript `localeCompare` return 不同的值

javascript `localeCompare` return different values

我现在正在使用 localeCompare javascript string 排序,我的数据也将包含几个 null 值。

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

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

但是如果我将空值与 o/O to z/Z 进行比较之后 returns 1

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

我知道 localeCompare 与比较 Unicode 一起工作,但为什么会出现上述行为,有什么原因吗?

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

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

因为

The localeCompare() method returns a number indicating whether a reference string comes before or after or is the same as the given string in sort order.

MDN

这意味着

"null".localeCompare("null") -> 将 return 0 因为它是同一个字符串
"n".localeCompare("null") -> 将 return -1null 之前一样 "o".localeCompare("null") -> 将 return 1 出现在 null

之后

如果您想要一个可以处理 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 和 "" 值将排序到底部。