我正在尝试对包含1-9中的单个数字的字符串进行排序。对于例如string是“Ho2w are1 y3ou”,那么结果字符串应为“are1 Ho2w y3ou”。为此,我已经使用了循环迭代字符串并使用split将其转换为字符串数组然后使用sort方法,但我没有得到输出。任何人都可以在我的程序中提出错误的建议吗?
代码::
function order(words){
let result = "";
for (let value of words) {
result += value;
}
let splited = result.split(" ");
if(words === ""){
return "";
}
return splited.sort((a,b) => a - b);
}
order("Ho2w are1 y3ou");
您需要以某种方式找到要用于排序的单词中的数字。一种方法是使用String.match()
和正则表达式:
let str = "Ho2w are1 y3ou"
let sorted =
str.split(' ')
.sort((a,b) => a.match(/\d+/)[0] - b.match(/\d+/)[0]) // sort based on first number found
.join(' ')
console.log(sorted)
您可以使用regexp /\s+/
来分割数组,这样您也可以匹配选项卡。正则表达式[^\d+]/g
删除那些不是数字的字符并仅与数字进行比较。
let str = "Ho2w are1 y3ou"
let sorted = str.split(/\s+/)
.sort((a, b) => a.replace(/[^\d+]/g, '') - b.replace(/[^\d+]/g, '')).join(' ');
console.log(sorted);
您还可以使用filter
和isNaN
提取字符,然后使用parseInt
获取其整数值以用于排序功能。
const str = "are1 Ho2w y3ou";
const ordered = str.split(" ").sort((a, b) => {
let numA = parseInt([...a].filter(c => !isNaN(c)).join(''));
numB = parseInt([...b].filter(c => !isNaN(c)).join(''));
return numA - numB;
}).join(' ');
console.log(ordered);