我怎样才能轻松地获得一个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毫秒。
其他回答
如果你使用prototype.js框架,那么这段代码将正常工作:
arr.min();
arr.max();
这里有文档:max的Javascript原型框架
如果你使用的是原型机,ChaosPandion的解决方案是有效的。如果不是,考虑一下:
Array.max = function( array ){
return Math.max.apply( Math, array );
};
Array.min = function( array ){
return Math.min.apply( Math, array );
};
如果数组值不是整数,上面的函数将返回NaN,因此您应该构建一些功能来避免这种情况。否则这个就可以了。
如果你使用sugar.js库,你可以按照你的建议编写arr.min()和arr.max()。您还可以从非数值数组中获得最小值和最大值。
min(map, all = false)返回数组中包含 最小值。Map可以是映射要检查的值的函数或 作为快捷键的字符串。如果全部为真,将返回所有的min 数组中的值。 max(map, all = false)返回数组中带有 最大的价值。Map可以是映射要检查的值的函数 或者是作为快捷键的字符串。如果all为true,将返回all max 数组中的值。
例子:
[1,2,3].min() == 1
['fee','fo','fum'].min('length') == "fo"
['fee','fo','fum'].min('length', true) == ["fo"]
['fee','fo','fum'].min(function(n) { return n.length; }); == "fo"
[{a:3,a:2}].min(function(n) { return n['a']; }) == {"a":2}
['fee','fo','fum'].max('length', true) == ["fee","fum"]
像Lo-Dash和underscore.js这样的库也提供了类似强大的min和max函数:
例子来自《Lo-Dash》:
_.max([4, 2, 8, 6]) == 8
var characters = [
{ 'name': 'barney', 'age': 36 },
{ 'name': 'fred', 'age': 40 }
];
_.max(characters, function(chr) { return chr.age; }) == { 'name': 'fred', 'age': 40 }
我想用下面的方式来做这件事
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];
};
Let array = [267, 306, 108] let longest = Math.max(…数组);