【发布时间】:2010-11-25 15:48:48
【问题描述】:
我有一个包含几个数字的简单 JavaScript 数组对象。
[267, 306, 108]
有没有一个函数可以在这个数组中找到最大的数?
【问题讨论】:
-
Math.max(...[267, 306, 108]);
标签: javascript algorithm arrays max
我有一个包含几个数字的简单 JavaScript 数组对象。
[267, 306, 108]
有没有一个函数可以在这个数组中找到最大的数?
【问题讨论】:
Math.max(...[267, 306, 108]);
标签: javascript algorithm arrays max
Array.max = function( array ){
return Math.max.apply( Math, array );
};
警告:由于the maximum number of arguments is as low as 65535 on some VMs,如果您不确定数组有那么小,请使用 for 循环。
【讨论】:
apply 电话的费用可以很容易地消除这一点。
RangeError: Maximum call stack size exceeded.
你可以使用apply函数,调用Math.max:
var array = [267, 306, 108];
var largest = Math.max.apply(Math, array); // 306
它是如何工作的?
apply 函数用于调用另一个函数,具有给定的上下文和参数,以数组的形式提供。 min 和 max 函数可以接受任意数量的输入参数:Math.max(val1, val2, ..., valN)
所以如果我们调用:
Math.min.apply(Math, [1, 2, 3, 4]);
apply 函数将执行:
Math.min(1, 2, 3, 4);
请注意,第一个参数上下文对于这些函数并不重要,因为它们是静态的。无论作为上下文传递什么,它们都将起作用。
【讨论】:
【讨论】:
我不是 JavaScript 专家,但我想看看这些方法是如何叠加的,所以这对我来说是个好习惯。我不知道这在技术上是否是对这些进行性能测试的正确方法,但我只是一个接一个地运行它们,正如您在我的代码中看到的那样。
排序并获得第 0 个值是迄今为止最糟糕的方法(它会修改数组的顺序,这可能是不可取的)。对于其他人来说,除非您说的是数百万个索引,否则差异可以忽略不计。
使用 100,000 索引的随机数数组运行五次的平均结果:
var performance = window.performance
function findmax(array)
{
var max = 0,
a = array.length,
counter
for (counter=0; counter<a; counter++)
{
if (array[counter] > max)
{
max = array[counter]
}
}
return max
}
function findBiggestNumber(num) {
var counts = []
var i
for (i = 0; i < num; i++) {
counts.push(Math.random())
}
var a, b
a = performance.now()
var biggest = counts.reduce(function(highest, count) {
return highest > count ? highest : count
}, 0)
b = performance.now()
console.log('reduce took ' + (b - a) + ' ms to run')
a = performance.now()
var biggest2 = Math.max.apply(Math, counts)
b = performance.now()
console.log('Math.max.apply took ' + (b - a) + ' ms to run')
a = performance.now()
var biggest3 = counts.sort(function(a,b) {return b-a;})[0]
b = performance.now()
console.log('sorting and getting the 0th value took ' + (b - a) + ' ms to run')
a = performance.now()
var biggest4 = counts.reduce(function(highest, count) {
return Math.max(highest, count)
}, 0)
b = performance.now()
console.log('Math.max within reduce() took ' + (b - a) + ' ms to run')
a = performance.now()
var biggest5 = findmax(counts)
b = performance.now()
console.log('custom findmax function took ' + (b - a) + ' ms to run')
console.log(biggest + '-' + biggest2 + '-' + biggest3 + '-' + biggest4 + '-' + biggest5)
}
findBiggestNumber(1E5)
【讨论】:
jsperf tests
我发现对于更大的数组(约 100k 个元素),使用简单的 for 循环简单地迭代数组实际上是值得的,性能比 Math.max.apply() 好约 30%:
function mymax(a)
{
var m = -Infinity, i = 0, n = a.length;
for (; i != n; ++i) {
if (a[i] > m) {
m = a[i];
}
}
return m;
}
【讨论】:
您可以按降序对数组进行排序并获得第一项:
[267, 306, 108].sort(function(a,b){return b-a;})[0]
【讨论】:
sort(function(a,b){return b-a;})
[...].sort().pop()
用途:
var arr = [1, 2, 3, 4];
var largest = arr.reduce(function(x,y) {
return (x > y) ? x : y;
});
console.log(largest);
【讨论】:
使用Array.reduce:
[0,1,2,3,4].reduce(function(previousValue, currentValue){
return Math.max(previousValue,currentValue);
});
【讨论】:
-Infinity。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max
const inputArray = [ 1, 3, 4, 9, 16, 2, 20, 18];
const maxNumber = Math.max(...inputArray);
console.log(maxNumber);
【讨论】:
以简单和手动的方式查找最大值和最小值。这段代码比Math.max.apply快很多;我已经在数组中尝试了多达 1000k 个数字。
function findmax(array)
{
var max = 0;
var a = array.length;
for (counter=0;counter<a;counter++)
{
if (array[counter] > max)
{
max = array[counter];
}
}
return max;
}
function findmin(array)
{
var min = array[0];
var a = array.length;
for (counter=0;counter<a;counter++)
{
if (array[counter] < min)
{
min = array[counter];
}
}
return min;
}
【讨论】:
findmax() 会给出错误的结果; findmin() 为空数组提供了错误的结果。
几乎所有答案都使用Math.max.apply(),这很好用,但也有局限性。
函数参数被放置在堆栈上,它有一个缺点 - 一个限制。因此,如果您的数组大于限制,它将失败并显示RangeError: Maximum call stack size exceeded.
要查找调用堆栈大小,我使用了以下代码:
var ar = [];
for (var i = 1; i < 100*99999; i++) {
ar.push(1);
try {
var max = Math.max.apply(Math, ar);
} catch(e) {
console.log('Limit reached: '+i+' error is: '+e);
break;
}
}
在我的机器上,它在 Firefox 上被证明是最大的 - 591519。这意味着如果您的数组包含超过 591519 个项目,Math.max.apply() 将导致 RangeError。
这个问题的最佳解决方案是迭代方式(信用:https://developer.mozilla.org/):
max = -Infinity, min = +Infinity;
for (var i = 0; i < numbers.length; i++) {
if (numbers[i] > max)
max = numbers[i];
if (numbers[i] < min)
min = numbers[i];
}
我已经在我的博客here 上写过这个问题。
【讨论】:
要查找数组中的最大数,您只需使用Math.max(...arrayName);。它的工作原理是这样的:
let myArr = [1, 2, 3, 4, 5, 6];
console.log(Math.max(...myArr));
要了解有关Math.max 的更多信息:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max
【讨论】:
简单的一个班轮
[].sort().pop()
【讨论】:
是的,当然存在Math.max.apply(null,[23,45,67,-45]),结果是返回67。
【讨论】:
不要忘记可以使用Function.prototype.bind 完成换行,为您提供“全原生”函数。
var aMax = Math.max.apply.bind(Math.max, Math);
aMax([1, 2, 3, 4, 5]); // 5
【讨论】:
您还可以扩展 Array 以拥有此功能并使其成为每个数组的一部分。
Array.prototype.max = function(){return Math.max.apply( Math, this )};
myArray = [1,2,3];
console.log( myArray.max() );
【讨论】:
你也可以使用forEach:
var maximum = Number.MIN_SAFE_INTEGER;
var array = [-3, -2, 217, 9, -8, 46];
array.forEach(function(value){
if(value > maximum) {
maximum = value;
}
});
console.log(maximum); // 217
【讨论】:
使用 - Array.prototype.reduce() 很酷!
[267, 306, 108].reduce((acc,val)=> (acc>val)?acc:val)
其中 acc = 累加器 和 val = 当前值;
var a = [267, 306, 108].reduce((acc,val)=> (acc>val)?acc:val);
console.log(a);
【讨论】:
关于如何使用三元运算符的递归方法
const findMax = (arr, max, i) => arr.length === i ? max :
findMax(arr, arr[i] > max ? arr[i] : max, ++i)
const arr = [5, 34, 2, 1, 6, 7, 9, 3];
const max = findMax(arr, arr[0], 0)
console.log(max);
【讨论】:
你可以试试这个,
var arr = [267, 306, 108];
var largestNum = 0;
for(i=0; i<arr.length; i++) {
if(arr[i] > largest){
var largest = arr[i];
}
}
console.log(largest);
【讨论】:
我刚开始使用 JavaScript,但我认为这种方法会很好:
var array = [34, 23, 57, 983, 198];
var score = 0;
for(var i = 0; i = array.length; i++) {
if(array[ i ] > score) {
score = array[i];
}
}
【讨论】:
array 只包含负数,这将有问题。
var nums = [1,4,5,3,1,4,7,8,6,2,1,4];
nums.sort();
nums.reverse();
alert(nums[0]);
最简单的方法:
var nums = [1,4,5,3,1,4,7,8,6,2,1,4]; nums.sort(); nums.reverse(); alert(nums[0]);
【讨论】:
运行这个:
Array.prototype.max = function(){
return Math.max.apply( Math, this );
};
现在试试[3,10,2].max() 返回10
【讨论】:
使用冒泡排序查找最大值和最小值
var arr = [267, 306, 108];
for(i=0, k=0; i<arr.length; i++) {
for(j=0; j<i; j++) {
if(arr[i]>arr[j]) {
k = arr[i];
arr[i] = arr[j];
arr[j] = k;
}
}
}
console.log('largest Number: '+ arr[0]);
console.log('Smallest Number: '+ arr[arr.length-1]);
【讨论】:
试试这个
function largestNum(arr) {
var currentLongest = arr[0]
for (var i=0; i< arr.length; i++){
if (arr[i] > currentLongest){
currentLongest = arr[i]
}
}
return currentLongest
}
【讨论】:
根据@Quasimondo 的comment,这似乎在很大程度上被遗漏了,下面似乎有最好的性能,如下所示:https://jsperf.com/finding-maximum-element-in-an-array。请注意,虽然对于问题中的数组,性能可能没有显着影响,但对于大型数组,性能变得更加重要,如果数组长度超过 65535,as noted 使用 Math.max() 甚至不起作用。请参阅还有this answer。
function largestNum(arr) {
var d = data;
var m = d[d.length - 1];
for (var i = d.length - 1; --i > -1;) {
if (d[i] > m) m = d[i];
}
return m;
}
【讨论】:
一个for/of循环解决方案:
const numbers = [2, 4, 6, 8, 80, 56, 10];
const findMax = (...numbers) => {
let currentMax = numbers[0]; // 2
for (const number of numbers) {
if (number > currentMax) {
console.log(number, currentMax);
currentMax = number;
}
}
console.log('Largest ', currentMax);
return currentMax;
};
findMax(...numbers);
【讨论】:
var max = [];
for(var i=0; arr.length>i; i++ ) {
var arra = arr[i];
var largest = Math.max.apply(Math, arra);
max.push(largest);
}
return max;
【讨论】:
var tmax = Math.max.apply(Math, max),或者更好的是,使用循环函数的闭包,例如在stackoverflow.com/a/54980012/7438857。有了这个修改,最好回答一个单独的问题,你如何“在多维数组中找到最大的数”,或者stackoverflow.com/questions/32616910/…。在制品:jsfiddle.net/jamesray/3cLu9for/8.
我在数组中返回最大数字的解决方案。
const largestOfFour = arr => {
let arr2 = [];
arr.map(e => {
let numStart = -Infinity;
e.forEach(num => {
if (num > numStart) {
numStart = num;
}
})
arr2.push(numStart);
})
return arr2;
}
【讨论】:
应该很简单:
var countArray = [1,2,3,4,5,1,3,51,35,1,357,2,34,1,3,5,6];
var highestCount = 0;
for(var i=0; i<=countArray.length; i++){
if(countArray[i]>=highestCount){
highestCount = countArray[i]
}
}
console.log("Highest Count is " + highestCount);
【讨论】: