【问题标题】:Sorting array keys case insensitive with swedish chars使用瑞典字符对数组键进行排序不区分大小写
【发布时间】:2019-05-18 12:03:36
【问题描述】:

我正在尝试按字母顺序“自然排序顺序”中的瑞典字符键对数组进行排序。这是测试数组:

var test = [];
test["abc"] = [];
test["ABC"] = [];
test["test"] = [];
test["Test"] = [];
test["åäö"] = [];
test["ÅÄÖ"] = [];

所需的结果是数组的创建顺序(abc、ABC、test、Test、åäö、ÅÄÖ),但我不知道如何获得该顺序。

我尝试过使用:

var sortedKeys = Object.keys(test).sort();

还有:

var sortedKeys= Object.keys(test).sort(function (a, b) {
    return a.toLowerCase().localeCompare(b.toLowerCase());
});

但我无法获得所需的键顺序。这是一个带有一些测试的jsfiddle: https://jsfiddle.net/3cs491gq/

感谢您帮助整理(!)这个。

【问题讨论】:

  • 为什么要将字符串键添加到数组中?看起来您需要一个关联数组(即类似字典的行为)。因此Object 是这里的正确选择。这样做的原因是数组是一个对象。您在这里没有使用任何类似数组的东西。 IMO test 应该是 var test = {};
  • 您正在创建一个对象,因此无法保证键顺序。使用数组,保证元素顺序。
  • @spender 真正的代码比这复杂一点,我试着在这里做一个简单的例子。
  • 如果没有定义'一种“自然”的方式',你就会在黑暗中得到答案。
  • 抱歉不清楚,但我想的是“自然排序”,比如:en.wikipedia.org/wiki/Natural_sort_order ...我已经稍微更新了这个问题。

标签: javascript arrays string object


【解决方案1】:

不要使用toLowerCase,只需使用sortlocaleCompare

var test = [];
test["ÅÄÖ"] = [];
test["abc"] = [];
test["ABC"] = [];
test["test"] = [];
test["Test"] = [];
test["åäö"] = [];

var sortedKeys = Object.keys(test).sort((a, b) => !/[a-z]/i.test(a) ? 1 : (/[a-z]/i.test(b) ? 0 : -1));

console.log(sortedKeys);

【讨论】:

  • 哈哈哈你没看到我在你之前发布了同样的答案吗:)
  • 否 - 查看您的输出和 OP 所需的输出,它们是不同的。
  • 是的,你的代码结果也是错误的,想要的结果是abc, ABC, test, Test, åäö, ÅÄÖ,你应该比较a to b
  • 固定@Alen.Toma - 我的代码输出正确的顺序。
  • 现在,当您必须编写a.localeCompare(b); 时,为什么还要使用正则表达式。无论如何,干得好。
【解决方案2】:

您的代码似乎可以正常工作。不过你不应该使用toLowerCase

这里我给你做了一个测试。

var test = [];
test["ÅÄÖ"] = [];
test["abc"] = [];
test["ABC"] = [];
test["test"] = [];
test["Test"] = [];
test["åäö"] = [];


var data =Object.keys(test).sort(function(a,b){
  return a.localeCompare(b);
});

console.log(data);

【讨论】:

  • 我在运行这个测试时得到这个命令:["åäö", "ÅÄÖ", "abc", "ABC", "test", "Test"] 而不是想要的["abc", "ABC", "test", "Test","åäö", "ÅÄÖ"]
【解决方案3】:

您可以像这样简单地将适当的参数添加到localeCompare

var test = [];
test["ÅÄÖ"] = [];
test["abc"] = [];
test["ABC"] = [];
test["test"] = [];
test["Test"] = [];
test["åäö"] = [];

var r = Object.keys(test).sort((a, b) => a.localeCompare(b, "sv", {sensitivity: 'case'}));

console.log(r);

在这种情况下,我们为Swedish 语言环境添加sv,并为选项添加sensitivity: 'case'

【讨论】:

    【解决方案4】:

    我终于找到了一种似乎运作良好的方法,至少在新版本的 Chrome、Safari 和 Opera 中是这样。这个问题很有帮助: How to sort special letters (typescript)?

    var test = [];
    test["abc"] = [];
    test["ABC"] = [];
    test["test"] = [];
    test["Test"] = [];
    test["åäö"] = [];
    test["ÅÄÖ"] = [];
    
    var sortedKeys = Object.keys(test).sort(new Intl.Collator("sv", { usage: "sort" }).compare);
    
    console.log(sortedKeys);
    

    这里有一个 jsfiddle:https://jsfiddle.net/ryv4hjk5/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-29
      • 2015-01-24
      • 2011-01-30
      • 2015-01-17
      • 2018-06-19
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多