如何在JavaScript数组中找到连续两个TYPE_A元素的首个索引?
解决方法:找到第一个连续两个TYPE_A元素的首个索引
你的需求很明确:在数组里找到第一个TYPE_A元素的索引,并且这个元素的下一个元素也必须是TYPE_A。先说说你用reduce的问题出在哪,再给你几个靠谱的解法。
为什么你的reduce代码会崩溃?
reduce的回调函数必须始终返回一个值,否则默认会返回undefined,这会导致下一次迭代时,a变成undefined,再访问a.type就直接抛出TypeError了。你的代码只有在匹配条件时才返回a,其他情况没有返回值,自然会出问题。
推荐解法:用findIndex(最简洁)
findIndex天生就是用来找第一个符合条件的元素索引的,非常适合你的场景:
const section = [{type: TYPE_B}, {type: TYPE_A}, {type: TYPE_B}, {type: TYPE_A}, {type: TYPE_A}]; // 找到第一个满足条件的索引,找不到返回-1 const targetIndex = section.findIndex((item, index) => { // 先确保下一个元素存在,避免越界 return index < section.length - 1 && item.type === TYPE_A && section[index + 1].type === TYPE_A; }); console.log(targetIndex); // 输出3
这段代码的逻辑很清晰:
- 遍历数组时,先判断当前索引不是最后一个(
index < section.length -1),防止访问section[index+1]越界 - 同时满足当前元素是
TYPE_A,且下一个元素也是TYPE_A findIndex会直接返回第一个符合条件的索引,完美匹配你的需求
如果一定要用reduce怎么改?
要是你坚持想用reduce,可以给它一个初始值(比如-1表示未找到),然后在迭代中维护这个结果:
const firstMatchIndex = section.reduce((result, item, index) => { // 如果已经找到结果,直接返回,不用再判断 if (result !== -1) return result; // 检查当前元素和下一个元素是否符合条件 if (index < section.length -1 && item.type === TYPE_A && section[index+1].type === TYPE_A) { return index; } // 不符合条件就保持原结果(-1) return result; }, -1);
这样每次迭代都有明确的返回值,不会出现undefined导致的崩溃问题。
内容的提问来源于stack exchange,提问作者martenolofsson
相关产品推荐
相关产品推荐

