我怎样才能轻松地获得一个JavaScript数组的最小或最大元素?
伪代码示例:
let array = [100, 0, 50]
array.min() //=> 0
array.max() //=> 100
我怎样才能轻松地获得一个JavaScript数组的最小或最大元素?
伪代码示例:
let array = [100, 0, 50]
array.min() //=> 0
array.max() //=> 100
当前回答
替代方法
的数学。min和数学。Max是一个很好的方法,可以从一个项目集合中获得最小和最大项目,但重要的是要意识到它可能带来的一些空腔。 将它们与包含大量条目的数组(超过~10⁷条,取决于用户的浏览器)一起使用,很可能会崩溃并给出以下错误消息:
const arr = Array.from(Array(1000000).keys());
Math.min(arr);
Math.max(arr);
Uncaught RangeError:超过最大调用堆栈大小
更新 最新的浏览器可能会返回NaN。这可能是一种更好的处理错误的方法,但是它还不能解决问题。
相反,可以考虑使用这样的语句:
function maxValue(arr) {
return arr.reduce((max, val) => max > val ? max : val)
}
或者有更好的运行时间:
function maxValue(arr) {
let max = arr[0];
for (let val of arr) {
if (val > max) {
max = val;
}
}
return max;
}
或者同时得到最小值和最大值:
function getMinMax(arr) {
return arr.reduce(({min, max}, v) => ({
min: min < v ? min : v,
max: max > v ? max : v,
}), { min: arr[0], max: arr[0] });
}
或者有更好的运行时*:
function getMinMax(arr) {
let min = arr[0];
let max = arr[0];
let i = arr.length;
while (i--) {
min = arr[i] < min ? arr[i] : min;
max = arr[i] > max ? arr[i] : max;
}
return { min, max };
}
*测试1,000,000项: 作为参考,第一个函数的运行时间(在我的机器上)是15.84毫秒,而第二个函数只有4.32毫秒。
其他回答
线性的,almost-purely-functional-approach
var min=[0, 29, 25].map((function(max) {max=-Infinity; return function(e) {return max=Math.max(max, e);}})())[0]
更多的例子:
求最小值
function getMin(arr) {
return (ar || [0, 29, 25]).
map((function(max) {max=-Infinity; return function(e) {return max=Math.max(max, e);}})())[0];
}
或者使用Array。映射方法与变量闭包
function getMin(arrObjs) {
return (arrObjs || [{val: 0}, {val: 29}, {val: 25}]).
map((function(max) {max=-Infinity; return function(e) {return max=(max.val>e.val?max:e);}})())[0];
}
求最大值
function getMax(arr) {
return (ar || [0, 29, 25]).
map((function(v) {v=Infinity; return function(e) {return v=Math.min(v, e);}})())[0];
}
对于对象数组
function getMax(arrObjs) {
return (arrObjs || [{val: 0}, {val: 29}, {val: 25}]).
map((function(v) {v=-Infinity; return function(e) {return v=(v.val<e.val?v:e);}})())[0];
}
我想用下面的方式来做这件事
const findMaxAndMin = (arr) => {
if (arr.length <= 0) return -1;
let min = arr[0];
let max = arr[0];
arr.forEach((n) => {
n > max ? (max = n) : false;
n < min ? (min = n) : false;
});
return [min, max];
};
如果你有一个复杂的对象,你可以使用排序....例如:如果我想获得包含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]是最大值。
使用Math.max()或Math.min()
Math.max(10, 20); // 20
Math.min(-10, -20); // -20
下面的函数使用function .prototype.apply()来查找数值数组中的最大元素。getMaxOfArray([1,2,3])等价于Math。max(1,2,3),但是您可以在任何大小的编程构造数组上使用getMaxOfArray()。
function getMaxOfArray(numArray) {
return Math.max.apply(null, numArray);
}
或者使用新的展开运算符,获得数组的最大值变得容易得多。
var arr = [1, 2, 3];
var max = Math.max(...arr); // 3
var min = Math.min(...arr); // 1
下面的代码为我工作:
var valueList = [10,4,17,9,3];
var maxValue = valueList.reduce(function(a, b) { return Math.max(a, b); });
var minValue = valueList.reduce(function(a, b) { return Math.min(a, b); });