在前端开发过程中,我们经常会遇到需要判断一个数组是否包含某个特定元素的情况。在 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