假设你得到了一个字符串,需要使用函数按字母顺序对该字符串进行排序。例如:
sortAlphabets( 'drpoklj' ); //=> returns 'djklopr'
怎样才是最好的做法?
假设你得到了一个字符串,需要使用函数按字母顺序对该字符串进行排序。例如:
sortAlphabets( 'drpoklj' ); //=> returns 'djklopr'
怎样才是最好的做法?
utf8
编码字符串变得非常简单。需要注意的是,不同语言的字符排序可能不同。更多关于 localCompare 的信息,请参见 MDN。
function sortAlphabet(str) {
return [...str].sort((a, b) => a.localeCompare(b)).join("");
}
console.log(sortAlphabet("drpoklj")); // Logs: "djklopr"
如果您只需要支持ASCII字符串,则默认的排序实现即可。
function sortAlphabet(str) {
return [...str].sort().join("");
}
.join("")
。 - yl2015正如之前的答案所示,您需要将字符串转换为单个字符的数组,对其进行排序,然后重新组合成字符串。 但是,使用 split
不是执行第一步的最佳实践方法,因为JavaScript字符串是一系列带有无效代理对的UTF-16代码单元, split("")
将代理对拆分成它们的单独代码单元,可能会将它们分开,从而破坏它们应该作为一对形成的代码点(宽松地说:字符)。因此,如果字符串中有表情符号(例如)或任何数以万计的非西方脚本中的字符,这些字符可能会被破坏。
在ES5及更早版本中,正确拆分字符串需要检测和处理代理对,以确保它们保持在一起,这有点麻烦,并涉及检查 charCodeAt
以特定值范围。
从ES2015+开始,这非常容易:您只需使用字符串的迭代器,该迭代器定义为提供字符串中的每个代码点,无论是单个代码单元还是两个代码单元。要获取代码点数组,可以通过扩展符号使用迭代器( [...str]
)或 Array.from
( Array.from(str)
)。
因此,使用它,我们得到:
function sortAlphabets(str) {
return [...str].sort((a, b) => a.localeCompare(b)).join("");
}
实时示例:
// Using the iterator
function sortAlphabets(str) {
return [...str].sort((a, b) => a.localeCompare(b)).join("");
}
// Using split("")
function sortAlphabetsUsingSplit(str) {
return str.split("").sort((a, b) => a.localeCompare(b)).join("");
}
const str = "देवनागरी";
console.log("Original string : " + str);
console.log("Using the iterator : " + sortAlphabets(str));
console.log("Using split('') : " + sortAlphabetsUsingSplit(str));
split
会导致某些字符变形。