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

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

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

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


当前回答

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

从文档中可以看到:

[…数组根据每个字符的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()传递一个比较函数,就像这里解释的那样。

其他回答

如果有人不理解Array.sort()如何处理整数,请阅读这个答案。

字母顺序排列:

默认情况下,sort()方法将值按字母和升序排列为字符串。

const myArray = [104, 140000, 99];
myArray.sort();
console.log(myArray); // output is [104, 140000, 99]

使用array.sort(compareFunction)的升序:

const myArray = [104, 140000, 99];
myArray.sort(function(a, b){
  return a - b;
});
console.log(myArray); // output is [99, 104, 140000]

w3schools的解释:

compareFunction定义了一个可选的排序顺序。函数应该返回一个负的、零的或正的值,这取决于参数,比如: 函数(a, b){返回a-b} 当sort()方法比较两个值时,它将值发送给compare函数,并根据返回值(负、零、正)对值进行排序。 例子: 当比较40和100时,sort()方法调用compare 函数(40100)。 该函数计算40-100,并返回-60(负值)。 sort函数将把40排序为低于100的值。

使用array.sort(compareFunction)按降序排列:

const myArray = [104, 140000, 99];
myArray.sort(function(a, b){
  return b - a;
});
console.log(myArray); // output is [140000, 104, 99]

这一次我们用b - a(即。, 100-40),返回正值。

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

从文档中可以看到:

[…数组根据每个字符的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()传递一个比较函数,就像这里解释的那样。

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

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}]**

Let grade =[80,100,50,90,40]; grade.sort ((x, y) = > x - y); grade.forEach(元素= > console.log(元素));

数组中。Sort默认执行字典排序,对于数字排序,提供自己的函数。这里有一个简单的例子:

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

numArray.sort(compareNumbers);

还要注意,排序是“就地”工作的,不需要赋值。