【问题标题】:Sort String Alphabetically Regardless of Capitalization - JavaScript无论大小写如何,按字母顺序对字符串进行排序 - JavaScript
【发布时间】:2019-06-07 17:49:49
【问题描述】:

正在处理this codewars challenge

重新排序字符串的字符,以便它们以“不区分大小写的字母顺序”顺序连接成一个新字符串。空格和标点符号应该被删除!

输入被限制为不包含数字,只包含包含英文字母的单词。

例子:

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"));

但我们当然想返回BbeehHilloTy,保持原始字符的大小写。

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

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

【问题讨论】:

  • 如您所说,在原始字符串中出现的顺序
  • 所以写一个自定义排序函数......
  • 来自MDN "默认排序顺序是基于将元素转换为字符串,然后比较它们的 UTF-16 代码单元值序列" 注意:NOT ASCII 表值。
  • s.split("").sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase())).join("")

标签: javascript sorting ascii alphabetical-sort alphabetized


【解决方案1】:

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

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"));

【讨论】:

  • 我意识到根据挑战,它也需要考虑随机字符串 - 应该处理非字母字符。
【解决方案2】:

根据@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 上的所有测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 2016-04-13
    • 2016-12-05
    • 2012-06-25
    • 2012-09-20
    相关资源
    最近更新 更多