我怎样才能轻松地获得一个JavaScript数组的最小或最大元素?
伪代码示例:
let array = [100, 0, 50]
array.min() //=> 0
array.max() //=> 100
我怎样才能轻松地获得一个JavaScript数组的最小或最大元素?
伪代码示例:
let array = [100, 0, 50]
array.min() //=> 0
array.max() //=> 100
当前回答
当意图是调用带有参数值列表的变进函数时,.apply经常被使用。
的数学。Max ([value1[,value2,…]])函数返回零个或多个数字中最大的一个。
Math.max(10, 20); // 20
Math.max(-10, -20); // -10
Math.max(-10, 20); // 20
Math.max()方法不允许传入数组。如果你有一个需要获取最大值的值列表,你通常会使用function .prototype.apply()调用这个函数,例如:
Math.max.apply(null, [10, 20]); // 20
Math.max.apply(null, [-10, -20]); // -10
Math.max.apply(null, [-10, 20]); // 20
然而,从ECMAScript 6开始,你可以使用扩展操作符:
展开运算符允许在需要多个参数(用于函数调用)或多个元素(用于数组字面量)的地方展开表达式。
使用展开运算符,上面的代码可以重写为:
Math.max(...[10, 20]); // 20
Math.max(...[-10, -20]); // -10
Math.max(...[-10, 20]); // 20
当使用可变值操作符调用函数时,您甚至可以添加额外的值,例如:
Math.max(...[10, 20], 50); // 50
Math.max(...[-10, -20], 50); // 50
奖金:
展开运算符使您能够在ES5中需要返回到命令式代码(使用push、splice等组合)的情况下使用数组文字语法创建新数组。
let foo = ['b', 'c'];
let bar = ['a', ...foo, 'd', 'e']; // ['a', 'b', 'c', 'd', 'e']
其他回答
Try
let max= a=> a.reduce((m,x)=> m>x ? m:x);
let min= a=> a.reduce((m,x)=> m<x ? m:x);
让max= a=> a.reduce((m,x)=> m>x ?m: x); 令min= a=> a.reduce((m,x)=> m<x ?m: x); // TEST -像素缓冲区 let arr =数组(200*800*4).fill(0); arr.forEach ((x, i) = > arr[我]= 100 -我% 101); console.log (Max,马克斯(arr)); console.log (Min, Min (arr))
对于数学。Min /max(+应用)我们得到错误:
超过最大调用堆栈大小(Chrome 74.0.3729.131)
// TEST -像素缓冲区 let arr =数组(200*800*4).fill(0); arr.forEach ((x, i) = > arr[我]= 100 -我% 101); // Exception:超过最大调用堆栈大小 尝试{ 让max1= Math.max(…arr) } catch(e) {console.error('Math. error ')Max:', e.message)} 尝试{ let max2= Math.max。应用(null, arr); } catch(e) {console.error('Math.max. error ')应用:',e.message)} // min相同
在这个时代(2022年),从数组中获得min + max的最有效方法是通过reduce在一次迭代中完成。
在JavaScript中:
const arr = [3, 0, -2, 5, 9, 4];
const i = arr.reduce((p, c) => {
p.min = c < p.min ? c : p.min ?? c;
p.max = c > p.max ? c : p.max ?? c;
return p;
}, {min: undefined, max: undefined});
console.log(i); //=> { min: -2, max: 9 }
当输入没有数据时,它将输出{min: undefined, max: undefined}。
在TypeScript中,你只需要添加类型强制转换,所以返回类型被推断为{min: number, max: number},而不是{min: any, max: any}:
const arr = [3, 0, -2, 5, 9, 4];
const i = arr.reduce((p, c) => {
p.min = c < p.min ? c : p.min ?? c;
p.max = c > p.max ? c : p.max ?? c;
return p;
}, {min: undefined as number, max: undefined as number});
//=> {min: number, max: number}
console.log(i); //=> { min: -2, max: 9 }
更新
在kiran goud注释之后,这里有一个使用数组而不是对象的替代方法:
const i = arr.reduce((p, c) => {
p[0] = c < p[0] ? c : p[0] ?? c;
p[1] = c > p[1] ? c : p[1] ?? c;
return p;
}, [undefined, undefined]);
console.log(i); //=> [-2, 9]
如果你像我一样偏执于使用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。
另一个解决方案
let arr = [1,10,25,15,31,5,7,101];
let sortedArr = arr.sort((a, b) => a - b)
let min = sortedArr[0];
let max = sortedArr[arr.length-1]
console.log(`min => ${min}. Max => ${max}`)
对于大数组(~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;
};