如何使用 ES8 的 Array.prototype.includes() 方法解决 JavaScript 数组匹配问题

在前端开发过程中,我们经常会遇到需要判断一个数组是否包含某个特定元素的情况。在 ES6 之前,我们通常会使用 Array.prototype.indexOf() 方法或 Array.prototype.includes() 方法来实现这个需求。但是这两种方法都存在一些缺陷,比如 indexOf() 方法返回的是元素在数组中的位置,但是对于一些复杂的数据结构,其比较方法可能会比较麻烦,而 includes() 方法只能判断元素是否存在,但是无法获取到其位置。在 ES8 中,新增了 Array.prototype.includes() 方法,它通过使用“SameValueZero”算法来判断每个数组元素是否和给定的值相等,返回布尔值以表示是否存在于数组中。本文将介绍如何使用 Array.prototype.includes() 方法来解决 JavaScript 数组匹配问题。

匹配任何值

首先,我们可以使用 Array.prototype.includes() 方法来匹配任何值,包括 NaN 和 undefined。例如:

const arr = [1, 2, NaN, undefined];

console.log(arr.includes(1)); // true
console.log(arr.includes(NaN)); // true
console.log(arr.includes(undefined)); // true

上述代码中,数组 arr 包含 1、2、NaN 和 undefined 四个元素。通过 arr.includes() 方法,我们可以判断数组中是否包含给定的值,包括 NaN 和 undefined。

自定义比较函数

不过有时候,我们需要在数组中查找某个特定对象,而不能简单地使用“SameValueZero”算法来比较两个对象是否相等。在这种情况下,我们可以自定义一个比较函数来代替默认的比较函数。例如:

const arr = [{ name: 'Alice' }, { name: 'Bob' }, { name: 'Charlie' }];

console.log(arr.includes({ name: 'Bob' })); // false

const obj = { name: 'Bob' };

console.log(arr.some(item => item.name === obj.name)); // true

上述代码中,我们定义了一个包含三个对象的数组 arr,每个对象都包含一个名为 name 的属性。我们尝试使用 arr.includes() 方法来查找一个特定的对象 { name: 'Bob' },但是该方法返回了 false,因为两个对象虽然包含相同的属性,但是它们的内存地址不同,因此并不相等。为了解决这个问题,我们可以自定义一个比较函数,例如使用 Array.prototype.some() 方法以自定义比较函数来实现:

const obj = { name: 'Bob' };

console.log(arr.some(item => item.name === obj.name)); // true

在这个例子中,我们使用了 Array.prototype.some() 方法以自定义比较函数来查找特定的对象,函数中的参数 item 代表数组中的每个对象,obj 表示我们要查找的对象的值。该方法会从数组中的第一个元素开始,直到找到第一个满足条件的元素,如果没有找到,则返回 false。

指定比较的起始位置

有时候,我们需要指定在数组的某个起始位置开始查找元素。在这种情况下,我们可以使用 Array.prototype.includes() 方法的第二个参数来指定比较的起始位置。例如:

const arr = [1, 2, 3, 4, 5];

console.log(arr.includes(3, 2)); // true

在这个例子中,数组 arr 包含从 1 到 5 的五个元素,我们尝试查找元素 3 是否在数组中,但是我们希望从数组的第二个元素开始查找。因此,我们传递了第二个参数 2,表示从数组索引为 2 的元素开始查找。最终返回了 true。

使用示例

下面是一些实际应用 Array.prototype.includes() 方法的示例:

判断字符串是否包含某个子串

const str = 'hello world';

console.log(str.includes('world')); // true
console.log(str.includes('WORLD')); // false

判断数组是否包含某个特定值

const arr = [1, 2, 3, 4, 5];

console.log(arr.includes(3)); // true
console.log(arr.includes(6)); // false

判断对象数组是否包含某个特定对象

const arr = [{ name: 'Alice' }, { name: 'Bob' }, { name: 'Charlie' }];

console.log(arr.some(item => item.name === 'Bob')); // true
console.log(arr.some(item => item.name === 'Dave')); // false

总结

使用 Array.prototype.includes() 方法可以方便地判断一个数组是否包含某个特定元素。我们可以使用该方法来进行任何值的比较,还可以自定义比较函数,指定比较的起始位置。但是需要注意,该方法只在 ES8 及更高版本的 JavaScript 中可用。在使用该方法时,还需要考虑到其性能问题,因为比较算法可能会比较消耗资源。希望本文能够帮助你更好地理解和使用 Array.prototype.includes() 方法。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a0d870add4f0e0ff90b06d


纠错反馈