jjzjj

javascript - String.prototype.localeCompare 处理大小写不一致?

coder 2024-05-17 原文

请参阅以下最小示例。所有示例都在 Chrome 76.0.3809.100、Firefox 68.0.2 和 Node.js 11.15.0 中进行了测试。所有结果都相同。

为了完整起见,提供了所有相关选项(但它们并不真正重要:默认的 sensitivity'variant',其工作方式几乎相同作为无重音字符的 'case',使用默认的 'sort' 用法。

没有设置能够解决下面详述的矛盾。我也尝试了几种语言选项,但无济于事。

示例 1.

以下是正确的:'a' 出现在 'b' 之前。

const result = 'a'.localeCompare('b', 'en', {
  sensitivity: 'case',
  usage: 'sort',
  caseFirst: 'lower'
});
// -1

示例 2.

以下是正确的:设置了 caseFirst: 'lower' 后,'b' 出现在 'B' 之前。

const result = 'b'.localeCompare('B', 'en', {
  sensitivity: 'case',
  usage: 'sort',
  caseFirst: 'lower'
});
// -1

示例 3.

以下也是正确的。 caseFirst 选项不需要被实现支持,但它是。设置了 caseFirst: 'upper' 后,'b' 出现在 'B' 之后。

const result = 'b'.localeCompare('B', 'en', {
  sensitivity: 'case',
  usage: 'sort',
  caseFirst: 'upper'
});
// 1

示例 4.

以下也是正确的。因为 'b' 出现在 'B' 之前,所以 'b{anything}' 出现在 'B{anything}':

const result = 'ba'.localeCompare('Ba', 'en', {
  sensitivity: 'case',
  usage: 'sort',
  caseFirst: 'lower'
});
// -1

示例 5.

我认为以下 1 结果不正确,因为它与 'b{anything}' 出现在 'B 之前相矛盾{anything}' 语句:

const result = 'bb'.localeCompare('Ba', 'en', {
  sensitivity: 'case',
  usage: 'sort',
  caseFirst: 'lower'
});
// 1

据此,'bb' 出现在 'Ba' 之后。设置 sensitivity: 'base'(比较不区分大小写)或 caseFirst: 'upper'(它们产生相同的 1 使用这些设置输出——正确——我试过了)。

但使用此设置,我希望得到 -1 结果:'bb' 出现在 'Ba' 之前,因为它们按字母顺序排在第一个字母、'b''B' 决定了它们的顺序('b''B' 之前,如示例 2. 所示)。

为什么 localeCompare 会这样?

最佳答案

它实际上不是那样工作的,因为它比较所有而不是字符串的字母位置与它们的字母位置。

您可以解决并将每个字母与另一个字符串中的一个进行比较(也许这还需要处理最小长度字母)。

var array = ['a', 'b', 'bb', 'Bb', 'ba', 'BA', 'B', 'bA'];

array.sort();
console.log(...array);

array.sort((a, b) => a.localeCompare(b, 'kf', { sensitivity: 'case', caseFirst: 'lower' }));
console.log(...array);

array.sort((a, b) => {
    var r;
    Array.from(a).some((c, i) => r = c.localeCompare(b[i], 'kf', { sensitivity: 'case', caseFirst: 'lower' }));
    return r;
});
console.log(...array);

关于javascript - String.prototype.localeCompare 处理大小写不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57671159/

有关javascript - String.prototype.localeCompare 处理大小写不一致?的更多相关文章

  1. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  2. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

  3. ruby - 从 String#split 返回的零长度字符串 - 2

    在Ruby1.9.3(可能还有更早的版本,不确定)中,我试图弄清楚为什么Ruby的String#split方法会给我某些结果。我得到的结果似乎与我的预期相反。这是一个例子:"abcabc".split("b")#=>["a","ca","c"]"abcabc".split("a")#=>["","bc","bc"]"abcabc".split("c")#=>["ab","ab"]在这里,第一个示例返回的正是我所期望的。但在第二个示例中,我很困惑为什么#split返回零长度字符串作为返回数组的第一个值。这是什么原因呢?这是我所期望的:"abcabc".split("a")#=>["bc"

  4. ruby - Ruby gsub 替换中的行为不一致? - 2

    两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio

  5. ruby-on-rails - Ruby 中意外的大小写行为 - 2

    我在一段非常简单的代码(如我所想)中得到了一个错误的值:org=4caseorgwhenorg=4val='H'endputsval=>nil请不要生气,我希望我错过了一些非常明显的东西,但我真的想不通。谢谢。 最佳答案 这是典型的Ruby错误。case有两种被调用的方法,一种是你传递一个东西作为分支的基础,另一种是你不传递的东西。如果您确实在case中指定了一个表达式语句然后评估所有其他条件并与===进行比较.在这种情况下org评估为false和org===false显然不是真的。所有其他情况也是如此,它们要么是真的,要么是假的。

  6. ruby - 改变替换的大小写 - 2

    我有以下内容:text.gsub(/(lower)(upper)/,'\1\2')我可以将\2替换为大写吗?类似于:sed-e's/\(abc\)/\U\1/'这在Ruby中可行吗? 最佳答案 查看gsub文档:str.gsub(模式){|匹配|block}→new_str在block形式中,当前匹配字符串作为参数传入,$1、$2、$`、$&、$'等变量将被适当设置。block返回的值将替换为每次调用的匹配项。"alowerupperb".gsub(/(lower)(upper)/){|s|$1+""+$2.upcase}

  7. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  8. Ruby-vips 图像处理库。有什么好的使用示例吗? - 2

    我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby​​代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby​​-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby​​-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby​​-vips的github页面上的链接,我们将不胜感激!如果有ruby​​-

  9. ruby - Faye WebSocket,关闭处理程序被触发后重新连接到套接字 - 2

    我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d

  10. ruby - 如何使用 Ruby HTTP::Net 处理 404 错误? - 2

    我正在尝试解析网页,但有时会收到404错误。这是我用来获取网页的代码:result=Net::HTTP::getURI.parse(URI.escape(url))如何测试result是否为404错误代码? 最佳答案 像这样重写你的代码:uri=URI.parse(url)result=Net::HTTP.start(uri.host,uri.port){|http|http.get(uri.path)}putsresult.codeputsresult.body这将打印状态码和正文。

随机推荐