我怎样才能轻松地获得一个JavaScript数组的最小或最大元素?
伪代码示例:
let array = [100, 0, 50]
array.min() //=> 0
array.max() //=> 100
我怎样才能轻松地获得一个JavaScript数组的最小或最大元素?
伪代码示例:
let array = [100, 0, 50]
array.min() //=> 0
array.max() //=> 100
当前回答
这里还有一个例子。使用lodash从数组中计算Max/Min值。
let 数组 = [100, 0, 50]; var func = _.over(Math.max, Math.min); var [max, min] = func(...阵列); => [100, 0] 控制台.log(最大); 控制台.log(分钟); <script src=“https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js”></script>
其他回答
找到数组元素的最小值的一个简单解决方案是使用数组原型函数reduce:
A = [4,3,-9,-2,2,1];
A.reduce((min, val) => val < min ? val : min, A[0]); // returns -9
或者使用JavaScript内置的Math.Min()函数(感谢@Tenflex):
A.reduce((min,val) => Math.min(min,val), A[0]);
这设置最小值为A[0],然后检查A[1]…A[n]是否严格小于当前最小值。如果A[i] < min,则min更新为A[i]。当所有数组元素都处理完后,返回min作为结果。
编辑:包括最小值位置:
A = [4,3,-9,-2,2,1];
A.reduce((min, val) => val < min._min ? {_min: val, _idx: min._curr, _curr: min._curr + 1} : {_min: min._min, _idx: min._idx, _curr: min._curr + 1}, {_min: A[0], _idx: 0, _curr: 0}); // returns { _min: -9, _idx: 2, _curr: 6 }
替代溶液
class SmallestIntegerFinder {
findSmallestInt(args) {
return args.reduce((min,item)=>{ return (min<item ? min : item)});
}
}
class SmallestIntegerFinder {
findSmallestInt(args) {
return Math.min(...args)
}
}
class SmallestIntegerFinder {
findSmallestInt(args) {
return Math.min.apply(null, args);
}
}
class SmallestIntegerFinder {
findSmallestInt(args) {
args.sort(function(a, b) {
return a - b; } )
return args[0];
}
}
您可能不希望向Array原型添加方法,这可能与其他库冲突。
我见过很多使用forEach的例子,我不推荐它用于大型数组,因为它的性能比for循环差。https://coderwall.com/p/kvzbpa/don-t-use-array-foreach-use-for-instead
同时数学。max(数学,[1,2,3]);总是给我NaN?
function minArray(a) {
var min=a[0]; for(var i=0,j=a.length;i<j;i++){min=a[i]<min?a[i]:min;}
return min;
}
function maxArray(a) {
var max=a[0]; for(var i=0,j=a.length;i<j;i++){max=a[i]>max?a[i]:max;}
return max;
}
minArray([1,2,3]); // returns 1
如果你有一个对象数组,下面的minArray()函数示例将接受2个参数,第一个是数组,第二个是对象键值比较的键名。本例中的函数将返回给定键值最小的数组的下标。
function minArray(a, key) {
var min, i, j, index=0;
if(!key) {
min=a[0];
for(i=0,j=a.length;i<j;i++){min=a[i]<min?a[i]:min;}
return min;
}
min=a[0][key];
for(i=0,j=a.length;i<j;i++){
if(a[i][key]<min) {
min = a[i][key];
index = i;
}
}
return index;
}
var a = [{fee: 9}, {fee: 2}, {fee: 5}];
minArray(a, "fee"); // returns 1, as 1 is the proper array index for the 2nd array element.
var max_of_array = Math.max.apply(Math, array);
完整的讨论见: http://aaroncrane.co.uk/2008/11/javascript_max_api/
替代方法
的数学。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毫秒。