为什么857大于1000和1001?使用Javascript

时间:2015-09-24 22:25:48

标签: javascript arrays

我有以下问题,我的函数接受一个包含4个数组的数组,每个元素都是一个数字。函数必须返回每个数组的最大元素。

function largestOfFour(arr) {
  var largest = [];
  for (var i = 0; i < arr.length; i++) {
    largest.push(arr[i].sort().pop());
  }
  console.log(largest);
  return largest;
}

largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

结果:

Array [ 5, 27, 39, 857 ]

显然它可以工作,但是当我尝试使用最后一个数组[1000,1001,185,1]时,其中1000和1001大于857我得到857.为什么会发生?

3 个答案:

答案 0 :(得分:10)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

数组值按字符串排序。如果要按数字排序,请使用自定义比较器函数。

来自MDN文档:

var numberArray = [40, 1, 5, 200];

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

console.log('numberArray:', numberArray.join());
console.log('Sorted without a compare function:', numberArray.sort());
console.log('Sorted with compareNumbers:', numberArray.sort(compareNumbers));

输出:

  

numberArray:40,1,5,200
  没有比较功能的排序:1,200,40,5
  用compareNumbers排序:1,5,40,200

答案 1 :(得分:2)

您正在使用array#sort方法,该方法将值比较为字符串而不是数字。更好的解决方案是使用array.prototype.mapMath.max.apply

function largestOfFour(array) {
    return array.map(function(arr) {
        return Math.max.apply(Math,arr);
    });
});

largestOfFour([[4,5,1,3],[13,27,18,26],[32,35,37,39],[1000,1001,857,1]]) 

=> [5,27,39,1001]

你也可以将一个函数传递给array#sort并执行类似这样的操作

array.sort(function(a,b) { return a - b })

pop()函数删除并返回数组的最后一个元素。在这种情况下,那将是1001.

答案 2 :(得分:2)

底线:8大于1

以下是关于此主题的简明文章:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

试试这个:

arr.sort(function(a, b){return a-b}).pop();

或只是Math.max()