【前端面试】面试官问:听说你会用这些数组方法啊?

129 阅读3分钟

面试中反复问到数组相关的操作,故做此篇当复习

ps:当初学的时候比较急,js基础这有些欠缺,一问就不行,苦涩~~

以下将结合面试题总结一下数组的基本操作,相信如果你和我一样,看完会有帮助

面试官:如何遍历数组找到与之匹配的id,并且拿到其中的项

1.首先我们得知道有几种遍历数组的方式

  • 无脑循环遍历:for循环、while循环(包含for... in 等)
  • 使用数组方法:
  1. 遍历数组的方法
方法名作用
forEach遍历数组,对数组中的每个元素执行一次提供的函数
some对数组中的元素进行测试,如果至少有一个元素满足测试函数,则返回true
every对数组中的所有元素进行测试,只有当所有元素都满足测试函数时,才返回true
filter创建一个新数组,包含通过所提供函数实现的测试的所有元素(过滤)
map创建一个新数组,其结果是调用提供的函数后返回的值
reduce对数组中的每个元素执行一个reducer函数,将其结果汇总为单个返回值

2.搜索数组的方法

方法名作用
find返回数组中满足提供的测试函数的第一个元素的值。如果没有元素满足测试,返回 undefined
findIndex返回数组中满足提供的测试函数的第一个元素的索引。如果没有元素满足测试,则返回 -1
  1. 其他数组方法
方法名作用
fill将一个固定值从一个起始索引(默认为 0)填充到终止索引(默认为数组长度),赋值操作不包括终止索引
copyWithin将数组的一部分浅复制到数组内的另一个位置,覆盖原有的值。这个方法不会改变数组的长度

很显然我们现在有以下几种解决方式

假设数组是这样的

const array = [ 
    { id: 1, name: 'Alice' }, 
    { id: 2, name: 'Bob' }, 
    { id: 3, name: 'Charlie' } 
]

const targetId = 2 //需要匹配的id
let foundItem //拿到的项
  1. 使用for循环遍历(个人总结:适用于要在匹配后立即进行操作的情况)
/**
 * for循环
 */
for (let i = 0; i < array.length; i++) {
    if (array[i].id === targetId) { 
        foundItem = array[i]
        break // 找到匹配项后退出循环 
    } 
}

/**
 * for ... of循环(ES6中增加的,更加简洁)
 */
for (const item of array) { 
    if (item.id === targetId) { 
        foundItem = item
        break
    } 
}

  1. 使用数组方法进行遍历

/**
 * forEach方法(不推荐使用,无论怎么样都会循环遍历整个数组)
 */
arr.forEach(item => {
    if(item.id === targetId) {
         foundItem = item
         return // forEach中没有break所以直接return掉(注意:退出的是函数,不是循环,forEach会遍历数组全部元素)
    }
})

/**
 * 使用filter方法(当数组中存在不止一个匹配项,并且需要全部取到的时候)
 */
 
 let foundItems = arr.filter(item => item.id === targetId)

  1. 使用数组方法进行搜索

/**
 * find方法
 */
 
 const foundItem = array.find(item => item.id === targetId);

。。。。面试的时候应该说这么多已经ok啦,我们接着来