停止案例敏感排序阵列



如何在数组JavaScript或Typescript中进行敏感排序的情况下进行分类。

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

输出应为

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

您可以使用Alpha-numeric的numeric: truecaseFirst: "upper"选项使用String.localecompare。对于符号情况,您可以在正则表达式上匹配并使用charCodeAt进行排序:

let data = ['/', '2', '$', '3', 'B', 'a', 'A']
let regEx = new RegExp(/[^a-zA-Zds:]/)
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)

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

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

这可以完成您想要的操作:

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

这可能对您有用。它根据默认的 .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']

最新更新