试图从一个只包含整数的数组中获得最大值和最小值似乎比我想象的要难。

var numArray = [140000, 104, 99]; numArray = numArray.sort(); console.log(numArray)

我希望这是99 104 140000。相反,它显示的是104、14万、99。看起来排序是把值当做字符串处理的。

有没有办法让排序函数对整数值进行排序?


当前回答

虽然在JavaScript中不是必需的,但如果希望sort() compareFunction严格返回-1、0或1(类似于PHP中的宇宙飞船操作符的工作方式),则可以使用Math.sign()。

下面的compareFunction严格返回-1、0或1:

numArray.sort((a, b) => Math.sign(a - b));

注意:Internet Explorer不支持Math.sign()。

其他回答

对于一个普通的元素数组,只有值:

function sortArrayOfElements(arrayToSort) {
    function compareElements(a, b) {
        if (a < b)
            return -1;
        if (a > b)
            return 1;
        return 0;
    }

    return arrayToSort.sort(compareElements);
}

e.g. 1:
var array1 = [1,2,545,676,64,2,24]
**output : [1, 2, 2, 24, 64, 545, 676]**

var array2 = ["v","a",545,676,64,2,"24"]
**output: ["a", "v", 2, "24", 64, 545, 676]**

对于对象数组:

function sortArrayOfObjects(arrayToSort, key) {
    function compareObjects(a, b) {
        if (a[key] < b[key])
            return -1;
        if (a[key] > b[key])
            return 1;
        return 0;
    }

    return arrayToSort.sort(compareObjects);
}

e.g. 1: var array1= [{"name": "User4", "value": 4},{"name": "User3", "value": 3},{"name": "User2", "value": 2}]

**output : [{"name": "User2", "value": 2},{"name": "User3", "value": 3},{"name": "User4", "value": 4}]**

排序函数的行为如此怪异的原因

从文档中可以看到:

[…数组根据每个字符的Unicode码位排序 值,根据字符串转换每个元素。

如果你打印数组的unicode点值,那么它就会被清除。

console.log(“140000”.charCodeAt (0)); console.log(“104”.charCodeAt (0)); console.log(“99”.charCodeAt (0)); //请注意,我们只查看数字charCodeAt(0)的第一个索引

返回:“49,49,57”。

49 (unicode value of first number at 140000)
49 (unicode value of first number at 104)
57 (unicode value of first number at 99)

现在,因为140000和104返回了相同的值(49),它切断了第一个索引并再次检查:

console.log(“40000”.charCodeAt (0)); console.log(“04”.charCodeAt (0)); //请注意,我们只查看数字charCodeAt(0)的第一个索引

52 (unicode value of first number at 40000)
40 (unicode value of first number at 04)

如果我们对这个进行排序,那么我们会得到:

40 (unicode value of first number at 04)
52 (unicode value of first number at 40000)

所以104在140000之前。

所以最终的结果是: var numArray = [140000, 104,99]; numArray = numArray.sort(); console.log (numArray)

104, 140,000, 99

结论:

Sort()仅通过查看数字的第一个索引来排序。Sort()并不关心一个整数是否比另一个大,它比较数字的unicode值,如果有两个相同的unicode值,那么它检查是否有下一个数字并进行比较。

要正确排序,必须向sort()传递一个比较函数,就像这里解释的那样。

打印稿变体

const compareNumbers = (a: number, b: number): number => a - b

myArray.sort(compareNumbers)

下面的'numerically'函数作为回调函数提供时,在许多情况下用于对数字数组进行数字排序:

function numerically(a, b){
    return a-b;
}

array.sort(numerically); 

但在一些罕见的情况下,数组包含非常大的负数,当a-b小于JavaScript可以处理的最小数字时,可能会发生溢出错误。

所以用数字表示函数的更好方法如下:

function numerically(a, b){
   if(a < b){
      return -1;
   } else if(a > b){
      return 1;
   } else {
      return 0;
   }
}

默认情况下,sort方法按字母顺序对元素排序。要进行数字排序,只需添加一个处理数字排序的新方法(sortNumber,如下所示)

var numArray = [140000, 104, 99]; numArray.sort(function(a, b) { 返回 A - B; }); console.log(numArray);

文档:

Mozilla Array.prototype.sort()建议对不包含Infinity或NaN的数组使用这个比较函数。(因为∞-∞是NaN,不是0)。

还有按键排序对象的例子。