You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:56:55