【问题标题】:stop case sensitive sorting array停止区分大小写的排序数组
【发布时间】:2019-10-08 11:50:09
【问题描述】:

如何在不区分大小写的数组 javascript 或 typescript 中进行排序。

就像输入是[/,2,$,3,B,a,A]

输出应该是

[$,/,2,3,A,a,B]

【问题讨论】:

  • 23 是数字还是字符串?如果a在未排序数组中A之前,为什么Aa之前?
  • @MrGeek:所有值都是字符串。我想要字母顺序跟大写字母像 A,a,B
  • 在这种情况下,请检查我的答案。

标签: javascript arrays typescript sorting


【解决方案1】:

alert(['/','2','$','3','B','a','A'].sort(Intl.Collator().compare));

检查此示例,它与您的输出完全相同,但需要进行一些修改。

【讨论】:

  • 我正在寻找除字母顺序 A、a、B 以外的所有值的正常排序
【解决方案2】:

您可以将String.localeComparenumeric: truecaseFirst: "upper" 选项一起用于字母数字。对于符号大小写,您可以匹配正则表达式并使用charCodeAt 进行排序:

let data = ['/', '2', '$', '3', 'B', 'a', 'A']
let regEx = new RegExp(/[^a-zA-Z\d\s:]/)

let result = data.sort((a, b) => {
  if (regEx.test(a) && regEx.test(b))
    return a.charCodeAt(0) - b.charCodeAt(0)
  else
    return a.localeCompare(b, 'en', { numeric: true, caseFirst: 'upper'})
})

console.log(result)

【讨论】:

  • 谢谢,但硬代码修复是不建议的,值可以是任何符号。
  • 更新了更好的正则表达式,匹配非字母数字,因此您可以匹配 charCodeAt 而不是 localeCompare 等。
  • 感谢您的快速解决方案。感谢您的努力。
  • 抱歉,这个场景不适用,["/", "2", "$", "3", "British", "a", "Asia"]。仅对单个字母排序工作正常。
【解决方案3】:

这就是你想要的:

var arr = ["/", "2", "$", "3", "B", "a", "A"];

var sorted = arr.sort(function(a, b) {
  var g = /^[A-Z]$/i;
  if (!g.test(a) || !g.test(b)) return a < b ? -1 : a > b ? 1 : 0;
  var r = a.toLowerCase().localeCompare(b.toLowerCase());
  return r ? r : b.localeCompare(a);
});

console.log(...sorted); // => $ / 2 3 A a B

【讨论】:

  • $ 应该首先作为数组排序的默认行为
  • @klmuralimohan 为什么$ 应该排在第一位?它不是原始数组中的第一个!
  • @klmuralimohan 现在$ 是第一位的,但问题中没有提到。
  • 感谢您的快速更新,但我不是在寻找“$”的硬代码修复。它应该像 array.sort() 一样排序,除了字母顺序。
  • @klmuralimohan 它现在应该像 Array.sort() 一样排序,除了字母顺序。
【解决方案4】:

这可能对你有用。它按照默认的.sort() 顺序排序,除了字母表,其中Aa 之前,在B 之前:

let arr = ['/','2','$','3','B','a','A']; 

arr.sort((a,b) => {

    let match = /\w/;
    //if it's an alphabet, we sort according to uppercase first
    if (match.test(a) && match.test(b)) {
        return a.localeCompare(b, "en", {caseFirst:"upper"});
    }
    // for all other symbols and numbers, we follow default .sort order
    else {
        let test = [a,b].sort();
        return (test[0] === a)?-1:1;
    }
});

console.log(arr); //['$', '/', 2, 3, 'A', 'a', 'B']

【讨论】:

    猜你喜欢
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 2020-09-13
    • 2012-06-22
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    相关资源
    最近更新 更多