首先,我找不到解决整个问题的问题。
我曾经比较像这样的数组:
array.sort((a, b) => {
return a.localeCompare(b, undefined, {numeric: true, sensitivity: 'base'})
})
但我意识到它不适用于像['a', 'A', 'B', -1.50', '0', '1.50', '-2', '2']
这样的数组。
预期输出为:['-2', '-1.50', '0', '1.50', '2', 'A', 'a', 'B']
。
我有一些肮脏的想法来实现它。但也许有一种简洁明了的方式。
答案 0 :(得分:5)
您可以通过获取所需属性的增量来预先进行比较。这样可以保存数值的顺序。
console.log(
['a', 'A', 'B', '-1.50', '0', '1.50', '-2', '2', 'D']
.sort((a, b) => a - b || a.localeCompare(b, undefined, {sensitivity: 'base'}))
);
可以省略
numeric: true
选项,因为在表达式的左侧不会有两个数字要比较。
答案 1 :(得分:2)
您应该使用isNaN
方法来检查是否比较数字字符串。如果是,建议不要localeCompare
,您需要使用Number(a) - Number(b)
array = ['a', 'A', 'B','-1.50', '0', '1.50', '-2', '2']
array.sort((a, b) => {
return !isNaN(a) && !isNaN(b) ? Number(a)-Number(b) : a.localeCompare(b, undefined, { sensitivity: 'base'});
})
console.log(array);

由于在Javascript中-
运算符仅定义为数字减法,因此操作数将被强制转换为Number
。所以你可以简单地使用:
array.sort((a, b) => {
return a - b || a.localeCompare(b, undefined, { sensitivity: 'base'});
})
答案 2 :(得分:2)
const customSort = (array) => {
return array.sort((a, b) => {
let r = /^-?\d+(?:\.\d+)?$/;
if (r.test(a) && r.test(b))
{
return a - b;
}
return a.localeCompare(b, undefined, {numeric: true, sensitivity: 'base'})
})
}
console.log(customSort(['a', 'A', 'B', '-1.50', '0', '1.50', '-2', '2']));
// => [ '-2', '-1.50', '0', '1.50', '2', 'a', 'A', 'B' ]