对具有负数和正数的字符串数组进行排序

时间:2018-05-09 07:37:20

标签: javascript

首先,我找不到解决整个问题的问题。

我曾经比较像这样的数组:

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']

我有一些肮脏的想法来实现它。但也许有一种简洁明了的方式。

3 个答案:

答案 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' ]