我怎样才能轻松地获得一个JavaScript数组的最小或最大元素?
伪代码示例:
let array = [100, 0, 50]
array.min() //=> 0
array.max() //=> 100
我怎样才能轻松地获得一个JavaScript数组的最小或最大元素?
伪代码示例:
let array = [100, 0, 50]
array.min() //=> 0
array.max() //=> 100
当前回答
如果你像我一样偏执于使用Math.max.apply(根据MDN给出大数组时可能会导致错误),试试这个:
function arrayMax(array) {
return array.reduce(function(a, b) {
return Math.max(a, b);
});
}
function arrayMin(array) {
return array.reduce(function(a, b) {
return Math.min(a, b);
});
}
或者,在ES6中:
function arrayMax(array) {
return array.reduce((a, b) => Math.max(a, b));
}
function arrayMin(array) {
return array.reduce((a, b) => Math.min(a, b));
}
不幸的是,匿名函数是必要的(而不是使用Math.max.bind(Math),因为reduce不仅将a和b传递给它的函数,还将i和对数组本身的引用传递给它,所以我们必须确保我们不会在这些函数上调用max。
其他回答
对于一个简洁的现代解决方案,可以对数组执行reduce操作,跟踪当前的最小值和最大值,因此数组只迭代一次(这是最优的)。为了简洁起见,这里使用了解构赋值。
Let array = [100, 0, 50]; Let [min, max] =数组。减少(((prevMin prevMax],咕咕叫)= > (数学。min(prevMin, curr),数学。max(prevMax, curr)],[∞,-∞]); console.log(“分钟:分钟); console.log(“马克斯:Max);
为了只找到最小值或最大值,我们可以以大致相同的方式使用执行reduce操作,但我们只需要跟踪之前的最优值。这种方法比使用apply更好,因为当数组对堆栈来说太大时,它不会导致错误。
Const arr = [- 1,9,3, - 6,35]; //只找到最小值 const min = arr.reduce((a,b)=>Math.min(a,b),无穷大); console.log(“分钟:Min); / / 6 //只找到最大值 const max = arr.reduce((a,b)=>Math.max(a,b), -无穷大); console.log(“马克斯:Max); / / 35
为了防止“max”和“min”被列在“for…”在“循环:
Object.defineProperty(Array.prototype, "max", {
enumerable: false,
configurable: false,
writable: false,
value: function() {
return Math.max.apply(null, this);
}
});
Object.defineProperty(Array.prototype, "min", {
enumerable: false,
configurable: false,
writable: false,
value: function() {
return Math.min.apply(null, this);
}
});
用法:
var x = [10,23,44,21,5];
x.max(); //44
x.min(); //5
如果你使用的是原型机,ChaosPandion的解决方案是有效的。如果不是,考虑一下:
Array.max = function( array ){
return Math.max.apply( Math, array );
};
Array.min = function( array ){
return Math.min.apply( Math, array );
};
如果数组值不是整数,上面的函数将返回NaN,因此您应该构建一些功能来避免这种情况。否则这个就可以了。
你可以在项目的任何地方使用下面的函数:
function getMin(array){
return Math.min.apply(Math,array);
}
function getMax(array){
return Math.max.apply(Math,array);
}
然后你可以调用传递数组的函数:
var myArray = [1,2,3,4,5,6,7];
var maximo = getMax(myArray); //return the highest number
我是这样解决问题的:
var strDiv = "4,8,5,1"
var arrayDivs = strDiv.split(",")
var str = "";
for (i=0;i<arrayDivs.length;i++)
{
if (i<arrayDivs.length-1)
{
str = str + eval('arrayDivs['+i+']')+',';
}
else if (i==arrayDivs.length-1)
{
str = str + eval('arrayDivs['+i+']');
}
}
str = 'Math.max(' + str + ')';
var numMax = eval(str);
我希望我能帮上忙。
致以最亲切的问候。