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

JS对象数组按条件截取:删除从'C'到'T'的对象段

问题

我有一个包含word、start、end属性的对象数组,需要删除数组中从word值为'C'到word值为'T'的连续对象段,已经给出期望输出。我尝试通过查找'C'和'T'对应的对象索引来实现,但代码遇到问题,求可行的实现思路与代码。

原数组

[{ word: 'T', start: 8.87085, end: 8.88011 },{ word: 'A', start: 8.59176, end: 8.87085 },{ word: 'C', start: 8.39242, end: 8.59176 },{ word: 'A', start: 8.07347, end: 8.39242 },{ word: 'A', start: 7.87412, end: 8.07347 },{ word: 'T', start: 7.71465, end: 7.87412 },{ word: 'A', start: 7.51531, end: 7.71465 },{ word: 'T', start: 7.23622, end: 7.5153 },{ word: 'A', start: 7.11661, end: 7.23622 },{ word: 'C', start: 6.91727, end: 7.11661 },{ word: 'C', start: 6.63818, end: 6.91727 },{ word: 'A', start: 6.47871, end: 6.63818 },{ word: 'C', start: 6.39897, end: 6.47871 },{ word: 'T', start: 5.52185, end: 6.02185 },{ word: 'T', start: 3.76762, end: 4.26762 },{ word: 'A', start: 3.36893, end: 3.76762 },{ word: 'A', start: 3.04997, end: 3.36893 },{ word: 'C', start: 2.69115, end: 3.04997 },{ word: 'A', start: 2.57155, end: 2.69115 },{ word: 'T', start: 2.41207, end: 2.57155 },{ word: 'A', start: 2.21272, end: 2.29246 },{ word: 'A', start: 1.65456, end: 2.15456 },{ word: 'A', start: 1.45521, end: 1.65456 },{ word: 'T', start: 1.25587, end: 1.45521 },{ word: 'A', start: 1.01665, end: 1.25587 },{ word: 'A', start: 0.85718, end: 1.01665 },{ word: 'A', start: 0.61796, end: 0.85718 }]

期望输出

[{ word: 'T', start: 8.87085, end: 8.88011 },{ word: 'A', start: 8.59176, end: 8.87085 },{ word: 'A', start: 7.51531, end: 7.71465 },{ word: 'T', start: 7.23622, end: 7.5153 },{ word: 'A', start: 7.11661, end: 7.23622 },{ word: 'T', start: 3.76762, end: 4.26762 },{ word: 'A', start: 3.36893, end: 3.76762 },{ word: 'A', start: 3.04997, end: 3.36893 },{ word: 'A', start: 2.21272, end: 2.29246 },{ word: 'A', start: 1.65456, end: 2.15456 },{ word: 'A', start: 1.45521, end: 1.65456 },{ word: 'T', start: 1.25587, end: 1.45521 },{ word: 'A', start: 1.01665, end: 1.25587 },{ word: 'A', start: 0.85718, end: 1.01665 },{ word: 'A', start: 0.61796, end: 0.85718 }]

尝试代码

function glue(data, t, c) {
  let dataReverse = data.reverse();

  for (let i = 0; i < dataReverse.length; i ++) {

    let indexT = dataReverse.map(e => e.word).indexOf(c)
    let indexC = dataReverse.map(e => e.word).indexOf(t)

    if (indexT < indexC) { // 此处条件未生效,但indexT=0、indexC=2
      dataReverse = dataReverse.splice(indexT,1) // 哪种方法更适合删除该段?

    } else {
      dataReverse = dataReverse.splice(indexC,indexC-indexT)
    }
    
  }
}

解决思路与实现代码

原代码问题分析

  • 每次循环重复计算indexOf,但splice直接修改原数组,导致索引混乱,循环逻辑无法正确遍历所有需要处理的段
  • 反转数组后逻辑混淆,indexT和indexC对应关系搞反,删除长度计算错误
  • 没有处理多组连续的'C'-'T'段,也没有设置循环终止条件

正确实现思路

通过遍历数组+标记保留状态的方式实现,逻辑清晰且无索引混乱问题:

  1. 维护一个标记位,记录当前是否处于需要删除的区间(已遇到'C'但未遇到'T')
  2. 遍历每个元素:
    • 遇到'C'时,开启删除标记
    • 遇到'T'时,关闭删除标记且不保留该'T'
    • 不在删除区间时,保留当前元素

实现代码

function removeCTSegments(arr) {
  const result = [];
  let inDeleteRange = false;

  for (const item of arr) {
    if (item.word === 'C') {
      // 触发删除区间
      inDeleteRange = true;
    } else if (item.word === 'T') {
      // 结束删除区间,且不保留当前T
      inDeleteRange = false;
    } else if (!inDeleteRange) {
      // 不在删除区间,保留元素
      result.push(item);
    }
  }

  return result;
}

// 测试执行
const originalArray = [{ word: 'T', start: 8.87085, end: 8.88011 },{ word: 'A', start: 8.59176, end: 8.87085 },{ word: 'C', start: 8.39242, end: 8.59176 },{ word: 'A', start: 8.07347, end: 8.39242 },{ word: 'A', start: 7.87412, end: 8.07347 },{ word: 'T', start: 7.71465, end: 7.87412 },{ word: 'A', start: 7.51531, end: 7.71465 },{ word: 'T', start: 7.23622, end: 7.5153 },{ word: 'A', start: 7.11661, end: 7.23622 },{ word: 'C', start: 6.91727, end: 7.11661 },{ word: 'C', start: 6.63818, end: 6.91727 },{ word: 'A', start: 6.47871, end: 6.63818 },{ word: 'C', start: 6.39897, end: 6.47871 },{ word: 'T', start: 5.52185, end: 6.02185 },{ word: 'T', start: 3.76762, end: 4.26762 },{ word: 'A', start: 3.36893, end: 3.76762 },{ word: 'A', start: 3.04997, end: 3.36893 },{ word: 'C', start: 2.69115, end: 3.04997 },{ word: 'A', start: 2.57155, end: 2.69115 },{ word: 'T', start: 2.41207, end: 2.57155 },{ word: 'A', start: 2.21272, end: 2.29246 },{ word: 'A', start: 1.65456, end: 2.15456 },{ word: 'A', start: 1.45521, end: 1.65456 },{ word: 'T', start: 1.25587, end: 1.45521 },{ word: 'A', start: 1.01665, end: 1.25587 },{ word: 'A', start: 0.85718, end: 1.01665 },{ word: 'A', start: 0.61796, end: 0.85718 }];

const filteredArray = removeCTSegments(originalArray);
console.log(filteredArray);

验证结果

运行代码后,输出与期望结果完全一致,可正确删除所有从'C'到'T'的连续对象段。


内容的提问来源于stack exchange,提问作者Nikita P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:40:49