【问题标题】:javascript sort with unicodejavascript 使用 unicode 排序
【发布时间】:2011-10-18 01:22:30
【问题描述】:

有很多通过某些属性(即“标题”)对某些 JSON 数组进行排序的示例 我们正在使用这样的比较功能:

function sortComparer(a, b) {
        if (a.title == b.title)
            return 0;
        return a1 > b1 ? 1 : -1;
    }

问题是塞尔维亚拉丁字母顺序看起来像“A、B、C、Č、Ć、D、...” 当使用上面的 sortComparer 时,我得到 D 在“Č”或“Ć”之前排序。 知道如何根据当前的文化语言进行排序吗?

【问题讨论】:

  • 一种方法是将其他字符替换为对应的 ASCII 字符。
  • 不确定你的想法。我想到的唯一方法是定义字母数组,例如: var letters = {'a','b','c', 'č','ć', ...} 并在 sortComparer 函数中比较索引.这种方法的缺点是我们必须为每种非英语的文化编写这样的数组。
  • Javascript 不支持 Unicode 排序算法,所以你基本上是被淹没了。您不能使用代码点排序并获得任何合理的东西。要获得字母排序,您需要 UCA。
  • 我认为您的预期顺序是错误的。有一个例子developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

标签: javascript sorting


【解决方案1】:

如果您系统中的区域设置正确,那么您可以使用localeCompare 方法而不是 大于 运算符来比较字符串 - 此方法是区域设置感知的。

function sortComparer(a,b){
    return a.title.localeCompare(b.title)
};

【讨论】:

  • 这只有在设置了区域设置时才有效。有什么方法可以将文化与比较值一起传递?
  • 无法通过脚本设置语言环境,它是由浏览器定义的,或者——取决于浏览器——继承自操作系统。
  • 我在这里找到了完整的解决方案stackoverflow.com/questions/3630645/…
  • 请注意,localeCompare 函数运行起来比仅使用 <>= 运算符比较字符串要重得多。即使从 500 个结果集开始,使用localeCompare 也会显着降低速度。如此处所示,它的速度慢了多达 400 倍:jsfiddle.net/L4715qey
  • desc排序怎么样?
【解决方案2】:

要使用自定义设置对数组进行排序,请执行以下操作:

  1. 创建一个具有自定义字母顺序的数组:

    var alphabets = ["A", "B", "C", "Č", "Ć", "D","Dž","Đ","E","F","G","H","I","J","K","L","Lj","M","N","Nj","O","P","R","S", "ÛŒ","T","U","V","Z","Ž"];

  2. 创建测试数组列表:

    var testArrray = ["B2","D6","A1","Ć5","Č4","C3"];

  3. 创建排序函数名:

    function OrderFunc(){
              testArrray.sort(function (a, b) {
                  return CharCompare(a, b, 0);
              });
          }
    
  4. 创建 CharCompare 函数(索引:在“AAAC”之前排序“AAAB”):

     function CharCompare(a, b, index) {
      if (index == a.length || index == b.length)
          return 0;
      //toUpperCase: isn't case sensitive
      var aChar = alphabets.indexOf(a.toUpperCase().charAt(index));
      var bChar = alphabets.indexOf(b.toUpperCase().charAt(index));
      if (aChar != bChar)
          return aChar - bChar
      else
          return CharCompare(a,b,index+1)
    

    }

  5. 调用 OrderFunc 对 testArray 进行排序(结果为:A1,B2,C3,Č4,Ć5,D6)。

Test Online

祝你好运

【讨论】:

  • @TheChetan。这是一个自定义排序功能,您可以管理要排序的所有字母。例如,俄语字母有 33 个字符,波斯语有 32 个字符等等。
【解决方案3】:

像你一样使用 Intl.Collat​​or 会得到完美的排序结果

function letterSort(lang, letters) {
  letters.sort(new Intl.Collator(lang).compare);
  return letters;
}

console.log(letterSort('gu', ['છ','ક','ખ']));
// expected output: Array ["a", "ä", "z"]

console.log(letterSort('sv', ['a','z','ä']));
// expected output: Array ["a", "z", "ä"]

更多细节你可以在这里查看https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Collator

【讨论】:

    猜你喜欢
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 2011-07-22
    相关资源
    最近更新 更多