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'段,也没有设置循环终止条件
正确实现思路
通过遍历数组+标记保留状态的方式实现,逻辑清晰且无索引混乱问题:
- 维护一个标记位,记录当前是否处于需要删除的区间(已遇到'C'但未遇到'T')
- 遍历每个元素:
- 遇到'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
相关产品推荐
相关产品推荐

