![](/img/trans.png)
[英]JavaScript localeCompare() returns different result than Java compareTo()
[英]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.