本文整理JavaScript中获取数组最大值和最小值的多种方法,包括手动遍历、利用forEach、reduce以及内置Math对象。重点解析Math.max/min配合apply和ES2015展开运算符的最佳实践,并探讨非纯数字数组的处理难点。
推荐阅读:JavaScript学习笔记之数组的增、删、改、查
JavaScript学习笔记之数组求和方法
JavaScript学习笔记之数组随机排序
获取数组最值的方法概述
在实际开发场景中,经常需要获取数组中的最大或最小值。然而,JavaScript原生数组对象并未提供类似arr.max()或arr.min()这样的直接方法。那么,是否可以通过其他途径实现这一功能呢?本文将梳理并介绍几种获取数组最大值和最小值的常用方法。
手动遍历与forEach实现
取数组中最大值
首先梳理基本思路:
将数组的第一个元素赋值给一个变量,并将该变量初始化为最大值;
开始遍历数组,从第二个元素开始,依次与当前最大值进行比较;
如果当前遍历到的元素大于当前记录的最大值,则将该元素值更新为最大值;
移动到下一个元素,重复上述比较操作;
当数组遍历结束时,该变量存储的值即为数组中的最大值。
代码如下:
Array.prototype.max = function () {
// 将数组第一个元素的值赋给max
var max = this[0];
// 使用for 循环从数组第一个值开始做遍历
for (var i = 1; i < this.length; i++) {
// 如果元素当前值大于max,就把这个当前值赋值给max
if (this[i] > max) {
max = this[i];
}
}
// 返回最大的值
return max;
}
来看一个具体示例:
var arr = [1,45,23,3,6,2,7,234,56];
arr.max(); // 234
上述示例中,数组仅包含数值类型。如果数组中包含非数值类型,结果会如何?让我们进行测试:
var arr = [1,45,23,3,6,2,7,234,56,'2345','a','c'];
arr.max(); // 'c'
这显然不是我们期望的结果。(此处寻求解决方案)
基于之前的学习,我们知道for循环的性能通常优于forEach()。因此,可以将上述逻辑改写为使用forEach()方法:
Array.prototype.max = function (){
var max = this[0];
this.forEach (function(ele,index,arr){
if(ele > max) {
max = ele;
}
})
return max;
}
var arr = [1,45,23,3,6,2,7,234,56];
arr.max(); // 234
取数组中最小值
获取最小值的思路与最大值类似,我们可以轻松实现arr.min()方法,从而提取数组中的最小值:
Array.prototype.min = function () {
var min = this[0];
this.forEach(function(ele, index,arr) {
if(ele < min) {
min = ele;
}
})
return min;
}
var arr = [1,45,23,3,6,2,7,234,56];
arr.min(); // 1
使用reduce方法
其他方法
除了上述方案,还可以利用数组的reduce()方法。回顾之前学过的知识,reduce()方法接收一个回调函数callbackfn,在该回调函数中,我们可以比较数组的初始值(preValue)与当前处理的数组项(curValue)。如果preValue大于curValue,则返回preValue;反之返回curValue。依此类推,即可取出数组中的最大值:
Array.prototype.max = function() {
return this.reduce(function(preValue, curValue,index,array) {
return preValue > curValue ? preValue : curValue;
})
}
var arr = [1,45,23,3,6,2,7,234,56];
arr.max(); // 234
同样地,可以使用类似的方法实现arr.min()方法,以获取数组中的最小值:
Array.prototype.min = function() {
return this.reduce(function(preValue, curValue,index,array) {
return preValue > curValue ? curValue : preValue;
})
}
var arr = [1,45,23,3,6,2,7,234,56];
arr.min(); // 1
内置Math函数与高阶技巧
内置函数Math.max()和Math.min()方法
对于仅包含数字的数组,可以使用JavaScript内置的Math.max()和Math.min()方法。这两个内置函数分别用于找出数组中的最大值和最小值。在使用它们之前,先了解一下Math.max()和Math.min()这两个函数的基本用法。
Math.max()
Math.max()函数返回一组数值中的最大值。
Math.max(1,32,45,31,3442,4); // 3442
Math.max(10, 20); // 20
Math.max(-10, -20); // -10
Math.max(-10, 20); // 20
Math.min()
Math.min()函数与Math.max()相反,它返回一组数值中的最小值:
Math.min(10,20); //10
Math.min(-10,-20); //-20
Math.min(-10,20); //-10
Math.min(1,32,45,31,3442,4); //1
如果这些函数没有参数,结果为-Infinity;如果任一参数无法转换为数值,结果为NaN。关键点在于,这两个函数不能直接作用于数字数组。但是,有一些类似的方法可以实现。
Function.prototype.apply()允许你使用提供的this值和参数数组来调用函数。
// 取出数组中最大值
Array.max = function( array ){
return Math.max.apply( Math, array );
};
// 取出数组中最小值
Array.min = function( array ){
return Math.min.apply( Math, array );
};
var arr = [1,45,23,3,6,2,7,234,56];
Array.max(arr); // 234
Array.min(arr); // 1
Math对象也是一个对象,可以使用对象字面量写法,例如:
Array.prototype.max = function () {
return Math.max.apply({},this);
}
Array.prototype.min = function () {
return Math.min.apply({},this);
}
var arr = [1,45,23,3,6,2,7,234,56];
arr.max(); // 234
arr.min(); // 1
其实还有更简单的方法。基于ES2015标准,可以使用展开运算符来实现此功能:
var numbers = [1, 2, 3, 4];
Math.max(...numbers) // 4
Math.min(...numbers) // 1
该运算符使数组中的值在函数调用位置展开。
总结
本文整理了从数组中获取最大值和最小值的几种方法。这些方法主要针对数字数组,当数组包含其他数据类型时,如何仅提取最大或最小的数值(如果您知道如何实现,欢迎指点迷津)。在这些方法中,使用JavaScript内置函数Math.max()和Math.min()配合Function.prototype.apply()可以方便地获取数组的最大值和最小值。当然,最简单的方法是使用ES2015中的展开运算符。
关于JavaScript获取数组最大值和最小值的方法就介绍到这里。如果大家有更好的方案,欢迎在评论区与我们分享。