dot*_*tty 201 javascript arrays algorithm max
我有一个包含几个数字的简单JavaScript Array对象.
[267, 306, 108]
Run Code Online (Sandbox Code Playgroud)
是否有一个函数可以找到这个数组中最大的数字?
Cre*_*esh 308
Array.max = function( array ){
return Math.max.apply( Math, array );
};
Run Code Online (Sandbox Code Playgroud)
CMS*_*CMS 194
您可以使用apply函数来调用Math.max:
var array = [267, 306, 108];
var largest = Math.max.apply(Math, array); // 306
Run Code Online (Sandbox Code Playgroud)
这个怎么运作?
该应用功能用于调用另一个函数,与给定的上下文中和参数,作为数组提供.min和max函数可以使用任意数量的输入参数:Math.max(val1,val2,...,valN)
所以如果我们打电话:
Math.min.apply(Math, [1,2,3,4]);
Run Code Online (Sandbox Code Playgroud)
apply函数将执行:
Math.min(1,2,3,4);
Run Code Online (Sandbox Code Playgroud)
请注意,第一个参数(上下文)对于这些函数并不重要,因为它们是静态的,无论作为上下文传递什么,它们都将起作用.
A.I*_*A.I 52
最简单的语法,使用新的扩展运算符:
var arr = [1, 2, 3];
var max = Math.max(...arr);
Run Code Online (Sandbox Code Playgroud)
资料来源:Mozilla MDN
red*_*r13 37
我不是JS专家,但我想看看这些方法是如何叠加的,所以这对我来说是个好习惯.我不知道这在技术上是否是正确的性能测试方法,但我只是一个接一个地运行它们,正如你在我的代码中看到的那样.
排序和获取第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)
Run Code Online (Sandbox Code Playgroud)
Ja͢*_*͢ck 36
我发现对于更大的数组(~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;
}
Run Code Online (Sandbox Code Playgroud)
Gum*_*mbo 29
您可以按降序对数组进行排序并获取第一个项目:
[267, 306, 108].sort(function(a,b){return b-a;})[0]
Run Code Online (Sandbox Code Playgroud)
brr*_*han 27
这个怎么样:
var arr = [1,2,3,4];
var largest = arr.reduce(function(x,y){
return (x > y) ? x : y;
});
console.log(largest);
Run Code Online (Sandbox Code Playgroud)
如何使用Array.reduce?
[0,1,2,3,4].reduce(function(previousValue, currentValue){
return Math.max(previousValue,currentValue);
});
Run Code Online (Sandbox Code Playgroud)
几乎所有答案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;
}
}
Run Code Online (Sandbox Code Playgroud)
它在我的机子上的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];
}
Run Code Online (Sandbox Code Playgroud)
我已经在这里的博客上写了关于这个问题的文章。
小智 5
以简单和手动的方式查找最大值和最小值。这段代码比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;
}
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
小智 5
要查找数组中的最大数,您只需要使用Math.max(...arrayName);
. 它是这样工作的:
let myArr = [1, 2, 3, 4, 5, 6];
console.log(Math.max(...myArr));
Run Code Online (Sandbox Code Playgroud)
要了解更多信息Math.max
:https :
//developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max