我有以下问题,我的函数接受一个包含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.为什么会发生?
答案 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.map
和Math.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()