繁体   English   中英

Dart compareTo() 有时返回与 javascript localeCompare() 不同的结果

[英]Dart compareTo() sometimes returns different result than javascript localeCompare()

我正在寻找一个 javascript 函数,它以“标准”方式比较两个字符串,或者至少以与dart相同的方式比较两个字符串。

我在dart中有这段代码,它给出了两个字符串,它检查哪个是最大的,并创建一个由“-”分隔的单个字符串,最大的字符串在前面。

//dart code
void main() {
  String currentUserId = "bbijdF7zKgR7jOIAs7Ka86jwdRu1";
  String peerId = "UVvUo4xCM4N4TtiFWL5B6vOFzN53";
  String groupChatId = "";
  if (currentUserId.compareTo(peerId) > 0) {
    groupChatId = '$currentUserId-$peerId';
  } else {
    groupChatId = '$peerId-$currentUserId';
  }
  print(groupChatId);
}

打印将返回bbijdF7zKgR7jOIAs7Ka86jwdRu1-UVvUo4xCM4N4TtiFWL5B6vOFzN53

到目前为止没有问题。

现在我应该在 javascript 中复制这段代码,我发现localeCompare 链接函数应该与 dart 中的compareTo()链接做同样的事情。 但情况并非如此,因为在两个字符串的情况下,它们具有不同的结果。

//js code
var currentUserId = "bbijdF7zKgR7jOIAs7Ka86jwdRu1";
var peerId = "UVvUo4xCM4N4TtiFWL5B6vOFzN53";
var groupChatId = "";
if (currentUserId.localeCompare(peerId) > 0) {
  groupChatId = `${currentUserId}-${peerId}`
} else {
  groupChatId = `${peerId}-${currentUserId}`
}
console.log(groupChatId)

打印将返回UVvUo4xCM4N4TtiFWL5B6vOFzN53-bbijdF7zKgR7jOIAs7Ka86jwdRu1

在极少数情况下,它们会给出两种不同的结果,但这正是问题所在。 javascript 中是否有任何行为类似于 dart 中的compareTo的函数?

如果有人可以向我解释为什么这两个功能有时会导致结果不同,我将不胜感激

在 Dart 中, compareTo按字符的代码点对字符串进行排序,但在使用localeCompare时,字符串会根据用户当前的语言按字典顺序进行比较。 此外, localeCompare的结果在具有不同区域设置的用户之间可能不一致

比较字符串的更好方法是将它们添加到数组中并.sort()它们。 这也按代码点排序,并且无论用户的区域设置如何,都将保持一致。 但是,由于您首先需要较低值的字符串,因此您需要一个自定义排序函数来处理此问题。

然后,不是使用字符串文字来组合,而是.join()带有-字符的数组。

 let userId = "bbijdF7zKgR7jOIAs7Ka86jwdRu1"; let peerId = "UVvUo4xCM4N4TtiFWL5B6vOFzN53"; let chatId = [userId, peerId].sort( new Intl.Collator('en', { caseFirst: 'lower' }).compare ).join('-'); console.log(chatId);

事实证明,这非常困难。 希望此解决方案在所有情况下都能如您所愿。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM