如何使用localecompare对包含负值的数字数组进行排序?

时间:2019-07-02 03:54:47

标签: javascript arrays

我正在尝试从最低值到最高值对数组进行排序。

下面的示例显示它已经按照这种方式进行了排序

var array = ["-394","-275","-156","-37","82","201","320","439","558","677","796"];

但是,当我这样做时:

var array = ["-394", "-275", "-156", "-37", "82", "201", "320", "439", "558", "677", "796"];
array.sort(function(a, b) {
  return a.localeCompare(b, undefined, {
    numeric: true
  })
});
console.log(array);

返回此值(我不确定发生了什么排序):

["-37", "-156", "-275", "-394", "82", "201", "320", "439", "558", "677", "796"]

我看过:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare

,但似乎没有特别提及处理负数的任何内容。

对包含负值的数字数组进行排序的正确方法是什么?

2 个答案:

答案 0 :(得分:5)

由于可以将数组项直接强制为数字,为什么不这么做呢?

var array = ["-394","-275","-156","-37","82","201","320","439","558","677","796"];
array.sort(function(a,b) { return a - b } );
console.log(array);

使用减法运算符的a - b会将两边的表达式都强制转换为数字。

不幸的是,数字排序规则未考虑-符号。您当前的代码会导致排序器将-的数字排序在数字之前,而数字之前没有-(因为从字法上来说-在数字之前)。

console.log('-'.charCodeAt());
console.log('0'.charCodeAt());

所以

  "-37",
  "-156",
  "-275",
  "-394",

37在156之前,在275之前,在394之前。(正数也发生了同样的事情,它们都在后面)。

答案 1 :(得分:0)

只需使用sort-您的所有项目都可以隐式转换为数字。

var array = ["-394","-275","-156","-37","82","201","320","439","558","677","796"];
const res = array.sort((a, b) => a - b);
console.log(res);
.as-console-wrapper { max-height: 100% !important; top: auto; }