方法一: indexOf (常用)
if (arr.indexOf(2) !== -1) { console.log("包含2") }
方法二: find() 该方法用于查找符合条件的第一个元素,如果找到了,返回这个元素,否则,返回undefined
if (arr.find(item =>item === 2)) { console.log("包含2") }
方法三: findIndex() 和find()类似,也是查找符合条件的第一个元素,不同之处在于findIndex()会返回这个元素的索引,如果没有找到,返回-1
if (arr.findIndex(item =>item === 2) !== -1) { console.log("包含2") }
方法四: some() 查找复合条件的元素, 如果查找到返回true, 反之false
if (arr.some(item =>item === 2) { console.log("包含2") }
方法五: 循环遍历 如map, forEach, if()等等, 此处只用forEach举例
aa.forEach(item =>{if (item === 2) {console.log("包含2")}})
findIndex它会返回数组中满足提供的函数的第一个元素的索引,否则返回 -1
跟findIndex差不多,只不过是倒序查找
观察可以知道findIndex 和findLastIndex的实现原理基本相同,区别只在于查找顺讯,那么如何通过实现一个函数,通过不同的传参来判断是使用findIndex还是findLastIndex呢?
实现:
新的需求:如何在一个排好序的数组中找到 value 对应的位置,保证插入数组后,依然保持有序的状态?
比如: sortedIndex([10, 20, 30], 25) // 2
如果是有序数组,那我们就不采用遍历的形式,采用二分法
看上去不错,基本实现了我们的要求,但还不够好,如果我想实现下面这种情况要怎么处理?
进阶实现:
现在尝试手写一个indexOf/lastIndexOf
indexOf和lastIndexOf都支持第二个参数fromIndex表示开始查找的位置。
在MDN上对fromIndex的解释如下:
fromIndex
开始查找的位置。如果该索引值大于或等于数组长度,意味着不会在数组里查找,返回-1。如果参数中提供的索引值是一个负值,则将其作为数组末尾的一个抵消,即-1表示从最后一个元素开始查找,-2表示从倒数第二个元素开始查找 ,以此类推。 注意:如果参数中提供的索引值是一个负值,并不改变其查找顺序,查找顺序仍然是从前向后查询数组。如果抵消后的索引值仍小于0,则整个数组都将会被查询。其默认值为0.
比如:
fromIndex
从此位置开始逆向查找。默认为数组的长度减 1(arr.length - 1),即整个数组都被查找。如果该值大于或等于数组的长度,则整个数组会被查找。如果为负值,将其视为从数组末尾向前的偏移。即使该值为负,数组仍然会被从后向前查找。如果该值为负时,其绝对值大于数组长度,则方法返回 -1,即数组不会被查找。
根据以上规则,我们实现第二版
主要围绕下面两点进行
根据以上要求,看下最终实现方法
const array = ['apple', 'banance', 'orange']
array.indexOf('apple')// 0 存在
array.indexOf('strawBerry') // -1不存在
const array = ['apple', 'banance', 'orange']
array.find(obj =>obj == 'banance')//banance 存在
array.find(obj =>obj == 'strawBally')//undefined 不存在
const arrayList = [
{name: '张三'}, {name: '李四'}
]
arrayList.find(obj =>obj.name == '李四')//{name: '李四'} 存在
arrayList.find(obj =>obj.name == '王五')//undefined 不存在
const array = ['apple', 'banance', 'orange']
array.findIndex(obj =>obj == 'banance') //大于0存在
array.findIndex(obj =>obj == 'strawBally') //-1 不存在
const array = ['apple', 'banance', 'orange']
array.includes('banance') //true存在
array.includes('strawBally') //false存在
const array = ['apple', 'banance', 'orange']
array.filter(obj =>obj == 'orange') //['orange'] 存在
array.filter(obj =>obj == 'strawBally') //[] 不存在
const array = [{ name: 'banance' }, { name: 'apple' }]
console.log(array.filter(obj =>obj.name === 'apple'))//[{name: 'apple'}] 存在
console.log(array.filter(obj =>obj.name === 'strawBally'))//[] 不存在