我怎样才能轻松地获得一个JavaScript数组的最小或最大元素?
伪代码示例:
let array = [100, 0, 50]
array.min() //=> 0
array.max() //=> 100
我怎样才能轻松地获得一个JavaScript数组的最小或最大元素?
伪代码示例:
let array = [100, 0, 50]
array.min() //=> 0
array.max() //=> 100
当前回答
出于学习目的,你可以使用变量和For循环,而不使用内置函数。
// Input sample data to the function var arr = [-1, 0, 3, 100, 99, 2, 99]; // Just to show the result console.log(findMinMax(arr)); function findMinMax(arr) { let arraySize = arr.length; if (arraySize > 0) { var MaxNumber = MinNumber = arr[0]; for (var i = 0; i <= arraySize; i++) { if (arr[i] > MaxNumber) { MaxNumber = arr[i]; }else if(arr[i] < MinNumber) { MinNumber = arr[i]; } } var minMax = [MinNumber,MaxNumber]; return minMax; } else { return 0; } }
其他回答
这也许适合你的目的。
Array.prototype.min = function(comparer) {
if (this.length === 0) return null;
if (this.length === 1) return this[0];
comparer = (comparer || Math.min);
var v = this[0];
for (var i = 1; i < this.length; i++) {
v = comparer(this[i], v);
}
return v;
}
Array.prototype.max = function(comparer) {
if (this.length === 0) return null;
if (this.length === 1) return this[0];
comparer = (comparer || Math.max);
var v = this[0];
for (var i = 1; i < this.length; i++) {
v = comparer(this[i], v);
}
return v;
}
你可以通过扩展Array类型来实现:
Array.max = function( array ){
return Math.max.apply( Math, array );
};
Array.min = function( array ){
return Math.min.apply( Math, array );
};
从这里开始(作者:John Resig)
对于大数组(~10⁷elements), Math。min和数学。max会在Node.js中产生以下错误。
RangeError:超过最大调用堆栈大小
一个更健壮的解决方案是不把每个元素都添加到调用堆栈中,而是传递一个数组:
function arrayMin(arr) {
return arr.reduce(function (p, v) {
return ( p < v ? p : v );
});
}
function arrayMax(arr) {
return arr.reduce(function (p, v) {
return ( p > v ? p : v );
});
}
如果你关心速度,下面的代码比我电脑上的Math.max.apply快3倍。见https://jsben.ch/JPOyL。
function arrayMin(arr) {
var len = arr.length, min = Infinity;
while (len--) {
if (arr[len] < min) {
min = arr[len];
}
}
return min;
};
function arrayMax(arr) {
var len = arr.length, max = -Infinity;
while (len--) {
if (arr[len] > max) {
max = arr[len];
}
}
return max;
};
如果数组包含字符串而不是数字,还需要将它们强制转换为数字。下面的代码可以做到这一点,但它会使代码在我的机器上减慢~10倍。见https://jsben.ch/uPipD。
function arrayMin(arr) {
var len = arr.length, min = Infinity;
while (len--) {
if (Number(arr[len]) < min) {
min = Number(arr[len]);
}
}
return min;
};
function arrayMax(arr) {
var len = arr.length, max = -Infinity;
while (len--) {
if (Number(arr[len]) > max) {
max = Number(arr[len]);
}
}
return max;
};
创建一个简单的对象
var myArray = new Array();
myArray = [10,12,14,100];
var getMaxHeight = {
hight : function( array ){ return Math.max.apply( Math, array );
}
getMaxHeight.hight(myArray);
如果你有一个复杂的对象,你可以使用排序....例如:如果我想获得包含MAX/MIN值低于objs的项目。
var objs= [
{name:"Apple",value:3},
{name:"Love",value:32},
{name:"Cheese",value:1},
{name:"Pork",value:77},
{name:"Xmas",value:99}
];
我会做一个排序:
objs.sort(function(a, b){return a.value-b.value});
然后: objs[0]是最小值,objs[objs. obs]length-1]是最大值。