我有一个字符串数组,如下所示。
let arr = ["1", "1+", "1-","2", "2+", "3","3+", "2-", "3-", "4", "10"];
我想要如下的预期输出。
["1+", "1", "1-", "2+", "2", "2-", "3+", "3", "3-", "4", "10"];
我尝试了下面的代码,但它没有给我正确的结果。
let arr = ["1", "1+", "1-","2", "2+", "3","3+", "2-", "3-", "4", "10"];
let result = arr.sort((a,b) => {
return a.localeCompare(b, undefined, {
numeric: true,
sensitivity: 'base',
});
});
console.log(result);
因此,您需要数字和符号的比较器。
一般概念:
您可以像这样定义符号优先级:
const signPriority = {
'+': 0,
'n': 1, // n = no sign
'-': 2,
}
Where key
是符号并且value
是我们将在比较器中使用的符号权重('n'
意思是“没有迹象”)。
然后我们将数组元素拆分为数字和符号,在比较器函数中并分别比较它们:
arr.sort((a, b) => {
// If numbers are different ...
if (parseInt(a) !== parseInt(b)) {
// Just compare a numbers
return parseInt(a) - parseInt(b);
} else {
// If sign matter ...
// Extract sign from element or define as 'n' if no sign found
const sign_a = ['+', '-'].includes(a.slice(-1)) ? a.slice(-1) : 'n';
const sign_b = ['+', '-'].includes(b.slice(-1)) ? b.slice(-1) : 'n';
// Compare signs using their weight
return signPriority[sign_a] - signPriority[sign_b];
}
})
完整解决方案:
const signPriority = {
'+': 0,
'n': 1,
'-': 2,
}
const arr = ["1", "1+", "1-","2", "2+", "3","3+", "2-", "3-", "4", "10"];
const sorted = arr.sort((a, b) => {
if (parseInt(a) !== parseInt(b)) {
return parseInt(a) - parseInt(b);
} else {
const sign_a = ['+', '-'].includes(a.slice(-1)) ? a.slice(-1) : 'n';
const sign_b = ['+', '-'].includes(b.slice(-1)) ? b.slice(-1) : 'n';
return signPriority[sign_a] - signPriority[sign_b];
}
})
console.log(sorted);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)