【问题标题】:How to sort array of numbers that includes negative values using localecompare?如何使用 localecompare 对包含负值的数字数组进行排序?
【发布时间】:2019-07-02 12:05:59
【问题描述】:

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

下面的例子显示它已经以这种方式排序

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

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

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

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    因为您的数组项可以直接强制转换为数字,为什么不这样做呢?

    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 之前。(同样的事情发生在正数之后,它们都在之后)。

    【讨论】:

    • 有趣的是,我实际上是在尝试在数组中找到“接近零的值”(在这种情况下是最接近零的负值)(localeCompare 步骤只是该过程中的一步) ,因此“以错误的方式进行操作”导致的“意外排序”似乎为我提供了一种通过引用“错误”排序数组的第一个值来获得所需值的方法。字典排序似乎将最接近零的值(包括负值)放在数组的开头。我确信有更好的方法可以做到这一点,但仍然很高兴知道。
    【解决方案2】:

    只需使用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; }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-27
      相关资源
      最近更新 更多