JS中求数组最大(最小)值汇总(延续更新)

怎样运用JS,在一个Number范例的数组里,查找最大(或最小)数呢?

以下引见五个要领。(假如有新要领,后续会更新,也迎接列位留言供应新要领)

1. 不运用任何库函数

代码以下:

function findMax1 (arr) {
    let result = 0;
    if (Array.isArray(arr) && arr.length > 0) {
        for (let i = 0; i < arr.length; i++) {
            result = arr[i] > result ? arr[i] : result;
        }
        
        return result;
    } else {
        throw new ReferenceError('The parameter arr is invalid');
    }
}

诠释:

运用一个变量result来存储最大值。遍历待查找的数组,假如当前遍历的元素大于result,就把这个元素赋值给result

假如求最小值,将arr[i] > result ? arr[i] : result;改成arr[i] < result ? arr[i] : result;

2. 运用Array.reduce()

代码以下:

function findMax2 (arr) {
    let result = 0;
    if (Array.isArray(arr) && arr.length > 0) {
        result = arr.reduce((a, b) => {
            return a > b ? a : b;
        }, 0);
        
        return result;
    } else {
        throw new ReferenceError('The parameter arr is invalid');
    }
}

诠释:

reduce要领就是经由过程一个函数,针对一个累加器(accumulator)和数组中的每个元素,将一个数组终究削减到一个值。

reduce接收两个参数:

  1. 第一个是callback,就是谁人前面提到的谁人函数。它有四个参数:

    1. accumulator:累加器,它是上次运转callback的效果。假如供应了initialValue,那末第一次就是initialValue
    2. currentValue:当前遍历的数组的元素;
    3. currentIndex:当前遍历的数组的元素的index,从0最先。假如供应了initialValue,那就从1最先;
    4. array:当前运用reduce的数组。
  2. 第二个是initialValue,是一个初值,作为第一次运转callback函数的第一个实参。这个是可选的。这里要注重一下,假如这个参数不供应,而且运用在一个空数组上,是会报错的。

那末上面代码的意义就是,每次遍历数组举行比较,大的就留下来,即accumulator,并将其用作下一次和数组元素的比较。末了只留下这一个值,即最大值。

假如求最小值,将a > b ? a : b; 改成 a < b ? a : b;

3. 运用Apply和Math.max()

代码以下:

function findMax3 (arr) {
    let result = 0;
    if (Array.isArray(arr) && arr.length > 0) {
        result = Math.max.apply(null, arr);
        
        return result;
    } else {
        throw new ReferenceError('The parameter arr is invalid');
    }
}

诠释:

apply诠释稍显庞杂,不作进一步的诠释。

它接收两个参数,第一个是thisArg,第二个是argsArray。两个都是可选的。此处简朴来讲,就是运用一个函数时,参数以数组的体式格局通报进去。

假如是求最小数,将Math.max()改成Math.min()

4. 只用Math.max()

代码以下:

function findMax4 (arr) {
    let result = 0;
    if (Array.isArray(arr) && arr.length > 0) {
        result = Math.max(...arr);
        
        return result;
    } else {
        throw new ReferenceError('The parameter arr is invalid');
    }
}

诠释:

基于上一个解法的思绪,在ES6中,有一个扩大运算符(…),能够将一个数组中的元素拆出来,构成一个用逗号分开的序列。恰好满足Math.max()函数的需求。

如上一种算法,假如是求最小数,将Math.max()改成Math.min()

运用Array.sort()排序

function findMax5 (arr) {
    let result = 0;
    if (Array.isArray(arr) && arr.length > 0) {
        arr.sort((x, y) => y - x);
        result = arr[0];
        return result;
    } else {
        throw new ReferenceError('The parameter arr is invalid');
    }
}

诠释:

经由过程Array.sort()要领将数组排序, 假如是求最大,就降序分列;假如是最小数,就升序分列。然后取第一个元素。

这里须要注重的是,Array.sort()假如不传任何参数,对整数的排序是有题目的,它只排第一位,也就是高位的递次,而不是全部整数的大小递次。比方[1, 34, 21, 4], 排序今后是[1, 21, 34, 4]。所以须要本身写个比较算法。上面的例子是降序分列的例子。假如是升序,将(x, y) => y - x改成(x, y) => x - y即可。

    原文作者:snowell
    原文地址: https://segmentfault.com/a/1190000014220464
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞