给定一个数组[1,8,5,4,3,9,2],编写一个算法,失去数组的最大值 9,和最小值 1。


1、通过prototype属性扩大min()函数和max()函数

算法1的思路是在自定义min()和max()函数中,通过循环由第一个值顺次与前面的值作比拟,动静更新最大值和最小值,从而找到后果。

        // 最小值        Array.prototype.min = function () {            let min = this[0];            let len = this.length;            for (let i = 1; i < len; i++) {                if (this[i] < min) min = this[i]            }            return min        }        // 最大值        Array.prototype.max = function () {            let max = this[0];            let len = this.length;            for (let i = 1; i < len; i++) {                if (this[i] > max) max = this[i]            }            return max        }        // 后果        console.log(arr.min()); // 1        console.log(arr.max()); // 9

2、借助Math对象的min()函数和max()函数

算法2的次要思路是通过apply()函数扭转函数的执行体,将数组作为参数传递给apply()函数。这样数组就能够间接调用Math对象的min()函数和max()函数来获取返回值。

        Array.min = function(array) {            return Math.min.apply(Math, array)        }        // 最大值        Array.max = function (array) {            return Math.max.apply(Math, array)        }        // 后果        console.log(Array.min(arr)); // 1        console.log(Array.max(arr)); // 9

3、算法2的优化

在算法2中将min()函数和max()函数作为Array类型的动态函数,但不反对链式调用,咱们能够利用对象字面量进行简化。

        // 最小值        Array.prototype.min = function() {            return Math.min.apply({}, this)        }        // 最大值        Array.prototype.max = function () {            return Math.max.apply({}, this)        }        // 后果        console.log(arr.min()); // 1        console.log(arr.max()); // 9

与算法2不同的是,在验证时,因为min()函数和max()函数属于实例办法,所以能够间接通过数组调用。
下面的算法代码中apply()函数传入的第一个值为{},理论示意以后执行环境的全局对象。第二个参数this指向须要解决的数组。
因为apply函数的特殊性第一个参数,指定为 null 或 undefined 时会主动替换为指向全局对象,原始值会被包装。所以咱们也能够将第一个参数设置为null、undefind。

4、借助Array类型的reduce()函数

算法4的次要思维是reduce()函数不设置initialValue初始值,将数组的第一个元素间接作为回调函数的第一个参数,顺次与前面的值进行比拟。当须要找最大值时,每轮累加器返回以后比拟中大的值;当须要找最小值时,每轮累加器返回以后比拟中小的值。

        // 最小值        Array.prototype.min = function () {            return this.reduce((pre, cur) => {                return pre < cur ? pre : cur            })        }        // 最大值        Array.prototype.max = function () {            return this.reduce((pre, cur) => {                return pre > cur ? pre : cur            })        }        // 后果        console.log(arr.min()); // 1        console.log(arr.max()); // 9

5、借助Array类型的sort()函数

算法5的次要思维时借助数组的原生sort()函数对数组进行排序,排序实现后首尾元素即是数组的最小、最大元素。
默认的sort()函数在排序时时依照字母程序排序的,数字会被依照字符串解决。例如数字 18 会被当做"18"解决,数字 6 被当"6"来解决,在排序时是依照字符串的每一位进行比拟的,因为"1"比"6"要小,所以"11"排序时要比"6"小。对于数值类型的数组来说,这显然不合理。所以咱们须要进行自定义排序。

        let sortArr = arr.sort((a, b) => a - b)        // 最小值        sortArr[0]        // 最大值        sortArr[sortArr.length - 1]        // 后果        console.log(sortArr[0]); // 1        console.log(sortArr[sortArr.length - 1]); // 9

6、借助ES6的扩大运算符

        // 最小值        Math.min(...arr)        // 最大值        Math.max(...arr)        // 后果        console.log(Math.min(...arr)); // 1        console.log(Math.max(...arr)); // 9