JavaScript提供了许多有用的数组方法来检查数组是否包含特定值。
虽然搜索数字或字符串之类的原始值相对容易,但是搜索对象则稍微复杂一些。
在本文中,您将了解如何确定数组是否包含特定值(原始或对象)。
1.数组包含原始值
JavaScript中的原始值是字符串,数字,布尔值,符号和特殊值undefined
。
确定数组是否包含原始值的最简单方法是使用array.includes()
ES2015数组方法:
第一个参数value
是要在数组中搜索的值。第二个可选参数fromIndex
是从何处开始搜索的索引。该方法返回一个布尔值,指示是否array
包含value
。
例如,让我们确定问候语数组是否包含'hi'
和'hey'
:
greetings.includes('hi')
返回,true
因为数组包含'hi'
item。
但是greetings.includes('hey')
return false
,表示数组中'hey'
缺少该值greetings
。
1.1从索引中搜索
array.includes(value, fromIndex)
还接受可选的第二个参数以开始搜索开始索引的值。
例如,让我们从1
数组中的第二个项目(索引和向上)开始搜索:
letters.includes('c', 1)
开始'c'
从索引中搜索字母1
。正如预期的那样,找到了这封信。
但是,letters.includes('a', 1)
返回false
是因为从index 1
到end 的数组不包含item 'a'
。
2.数组包含一个对象
检查数组是否包含对象比搜索原始值稍微复杂一些。
确定数组是否包含对对象的引用很容易-只需使用该array.includes()
方法即可。例如:
greetings.includes(toSearch)
返回true
因为greetings
数组包含toSearch
对象引用(指向数组的第一项)。
但是更常见的是,您不想按引用进行搜索,而是希望按其内容搜索对象。在这种情况下array.includes()
将不起作用:
greetings.includes(toSearch)
返回false
,因为数组不包含toSearch
对象引用。尽管数组包含的对象hi
看起来完全一样toSearch
。
好的,那么您如何确定数组是否按内容而不是引用包含对象?使用array.some()
方法结合对象的浅层或深层相等性检查。
在对象的浅层相等检查期间,将检查两个对象的属性列表是否相等。
这是浅层相等检查的可能实现:
shallowEqual(object1, object2)
返回true
的情况下,如果两个进行比较的对象object1
,并object2
具有相同的组具有相同值属性。
在以下代码段中,hi
和hiCopy
内容相等,而hi
和hello
则不相等:
提醒一下,如果至少有一个time 函数返回,则array方法array.some(callback)
将返回。 truecallbacktrue
现在,让我们结合使用浅等式函数和array.some(callback)
method来按内容查找数组是否包含对象:
greetings.some(item => shallowEqual(item, toSearch))
检查数组的每个项目与toSearch
对象的浅浅相等性。
如果搜索到的对象还包含嵌套对象,则shallowEqual()
可以使用deepEqual()函数代替函数。
3.总结
在数组内部搜索诸如字符串或数字之类的原始值很简单:只需使用array.includes(value)
方法即可。
通过内容确定数组是否包含对象需要更多的活动部分。您必须array.some(callback)
结合浅层相等性检查使用方法:
注意,提出的方法不是唯一的方法。例如,很长时间array.indexOf(value) !== -1
以来一直使用表达式(slighlty clumsy)来确定是否array
包含value
。
您还知道什么其他方法可以检测数组是否包含值?
原著作者:德米特里·帕夫鲁汀
文章来源:国外
原著链接:
Dmitri Pavlutin Blogdmitripavlutin.comPS:原著文章内容为英文版本,建议使用360极速浏览器进行翻译阅读。