无论大小写如何,按字母顺序对字符串进行排序 - JavaScript

Sort String Alphabetically Regardless of Capitalization - JavaScript

正在处理 this codewars challenge

Re-order the characters of a string, so that they are concatenated into a new string in "case-insensitively-alphabetical-order-of-appearance" order. Whitespace and punctuation shall simply be removed!

The input is restricted to contain no numerals and only words containing the english alphabet letters.

Example:

alphabetized("The Holy Bible") // "BbeehHilloTy"

我开始于:

function alphabetized(s) {
    s = s.replace(/\s/g, "").toLowerCase();
    return s.split("").sort().join("");
}

console.log(alphabetized("The Holy Bible"));

但是我们当然想要returnBbeehHilloTy,保持原始字符的大写。

坦率地说,我不明白为什么期望的结果应该是 BbeehHilloTy

如果我们不根据 ASCII 字符代码值排序,那么是什么决定了新字符串中大写字母是否应该出现在小写字母前面?

根据@user3483203 的代码:

function alphabetized(s) {
    s = s.replace(/\s+|\W+|\d+|[_]+/g, "");
    return s.split("").sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase())).join("");
}

console.log(alphabetized("The Holy Bible"));

所以关键是这里要用localCompare()

编辑:实际上此解决方案不适用于 Codewars 上的所有测试。

下面是一种通过比较字符串中字符的索引是否相等来创建稳定排序的方法:

function alphabetized(s){
  s = s.replace(/\s+|\W+|\d+|[_]+/g, "");
  return s.split('')
    .map(function(x, i){ return [x, i]; })
    .sort(function([a, i], [b, j]){
      a = a.toLowerCase();
      b = b.toLowerCase();
      if (a == b)
        return i - j;
      else if (a < b)
        return -1;
      else
        return 1;
      })
      .map(function([x, i]){ return x; })
      .join('');
}

console.log(alphabetized("The Holy Bible"));