如何在JavaScript中获取数组的最小和最大元素

137 阅读4分钟

简介

在使用JavaScript时,我们经常会遇到需要获得数组的最小和最大元素的情况--无论是为滑块设置边界还是向用户显示统计数据。

在这篇文章中,我们将看看如何在JavaScript中获得一个数组的最小和最大元素。我们还将看一下四种不同的方法,并比较它们在处理大数组时的速度。

如何使用数学对象获得数组的最小和最大元素

Math 是JavaScript内置的全局便利对象,包含了很多你在进行数学运算时可能需要的方法和常量。在这篇文章中,我们将使用的两个方法是 和 - 它们都接受一个数字列表作为参数。正如它们的名字所暗示的那样,一个返回具有最低值的元素,另一个返回具有最高值的元素。Math.min() Math.max()

console.log(Math.min(20, 23, 27)); // 20
console.log(Math.max(20, 23, 27)); // 27

console.log(Math.min(-20, -23, -27)); // -27
console.log(Math.max(-20, -23, -27)); // -20

如果传递的元素中至少有一个不是数字或不能转换为数字,Math.min()Math.max() 都会返回NaN

console.log(Math.min('-20', -23, -27)); // -27
console.log(Math.max('number', -23, -27)); // NaN

同样,如果我们试图传递一个数组作为Math.min() 函数的参数,我们会得到一个NaN ,因为它被视为一个单一的元素,不能被转换为标量值。

const myArray = [2, 3, 1];
console.log(Math.min(myArray)); // NaN

然而,快速解决这个问题的方法是使用spread运算符来解包元素。

const myArray = [2, 3, 1];
console.log(Math.min(...myArray)); // 1

如果你想了解更多关于传播操作符的信息--请阅读我们的《JavaScript中的传播操作符指南》!

用*reduce()*获得最大和最小元素

减少操作,有时也被称为折叠,是函数式编程中最强大的一些操作,有着广泛的应用。reduce() 函数,在每个数组元素上运行一个还原函数(定义在一个回调中),最后返回一个单一的值。

由于该方法的应用非常普遍,所以值得介绍。

const myArray = [20, 23, 27];

let minElement = myArray.reduce((a, b) => {
    return Math.min(a, b);
});

console.log(minElement); // 20

用*apply()*查找最小和最大元素

apply() 方法是用来调用一个具有给定this 值和参数数组的函数。这使得我们有可能将数组输入到Math.min() 静态函数中。

const myArray = [20, 23, 27];

let minElement = Math.min.apply(Math, myArray);
console.log(minElement); // 20
// Or
let minElement = Math.min.apply(null, myArray);
console.log(minElement); // 20

用标准循环获取最小和最大元素 - 最快的性能

循环在JavaScript中被用来根据一个条件执行重复的任务。条件返回truefalse 。一个循环将继续运行,直到定义的条件返回false 。在我们的案例中,我们将利用for 循环 - 它通常用于多次运行代码。

获取最小元素

首先,我们要将最小元素初始化为数组的第一个元素。然后,我们在整个数组中循环,看是否有其他元素的值小于当前的最小值--如果是,我们将把新的最小值设置为当前元素的值。

const myArray = [20, 23, 27];

let minElement = myArray[0];
for (let i = 1; i < arrayLength; ++i) {
    if (myArray[i] < minElement) {
        minElement = myArray[i];
    }
}

console.log(minElement); // 20

获取最大元素

我们首先将最大元素初始化为数组中的第一个元素。然后我们将循环浏览整个数组,看是否有其他元素大于初始化的元素,从而将其替换掉。

const myArray = [20, 23, 27];

let maxElement = myArray[0];
for (let i = 1; i < arrayLength; ++i) {
    if (myArray[i] > maxElement) {
        maxElement = myArray[i];
    }
}

console.log(maxElement); // 27

性能基准测试

使用JS Benchmark - 我们在不同的输入上运行所有这些方法,从数组中的100到1000000个元素。性能是相对的,并且取决于数组的长度。

  • 对于小数组(100),reduce() 方法表现最好,其次是标准循环,传播操作者,然后是apply() 方法。亚军的性能几乎相同。
  • 对于中型数组(1000),标准循环的性能最好,其次是reduce() ,传播算子和apply() 方法。标准循环的速度明显快于reduce() ,而 的速度又相当快于亚军。
  • 对于真正的大数组(1000000),标准循环在很大程度上超过了所有其他方法,所以标准循环的案例是非常强大的。

标准循环的规模非常好,只有在应用于小数组时才会输给竞争对手。如果你正在处理一些项目,或者较小的数组,所有的方法都将是相当无缝的。阵列越大,使用标准循环的好处就越大。

**注意:**不要以表面价值来看待基准测试!它们是在不同的机器上运行的。它们是在不同的机器上运行的,可能有不同的浏览器版本和JS引擎。在你的应用程序中测试这些,并为你自己的用例选择可扩展的、最快的选项。

总结

在本指南中,我们已经看了如何在JavaScript中获得数组的最小和最大元素。我们看了Math.min()Math.max() 方法、传播操作符、reduce() 方法、apply() 方法,并写了一个自定义的方法来通过for 循环获得元素。

最后,我们对结果进行了基准测试,指出对于小数组来说,使用哪种方法并不重要,而对于大数组来说,你应该倾向于使用标准的for循环。