如何在JavaScript中从数组末尾查找有效元素索引实现首尾裁剪
实现方案
首先优化有效值判断逻辑:你当前用的el >= 0存在边界问题,合法的负整数/负浮点数会被误判为无效值,建议用更严谨的判断:
// 有效值判断:数字类型且非NaN,覆盖正负整数、浮点数、0 const isValid = val => typeof val === 'number' && !Number.isNaN(val)
下标查找方案(无需反转数组,兼容性最好)
直接倒序遍历子数组查找最后一个有效元素的下标即可,时间复杂度和正向查找一致,不会产生额外的数组拷贝开销:
function getTrimIndexes(subArr) { const len = subArr.length // 查找头部第一个有效下标 const startIndex = subArr.findIndex(isValid) // 全是无效值的边界情况处理 if (startIndex === -1) return { startIndex: -1, endIndex: -1, trimmedArr: [] } // 倒序查找尾部最后一个有效下标 let endIndex = len - 1 while (endIndex >= startIndex && !isValid(subArr[endIndex])) { endIndex-- } return { startIndex, // 头部裁剪起始下标 endIndex, // 尾部裁剪结束下标 // 裁剪后的数组,slice左闭右开所以endIndex要+1 trimmedArr: subArr.slice(startIndex, endIndex + 1) } }
测试效果
对你给出的示例数组批量处理:
const arr = [ [1, 2, 3, 4, 3, 2, 4], [1, 0, 3, 4, 3, 2, 0], [undefined, 0, null, 4, 3, null, 0], [undefined, undefined, 5, 7, undefined, null, undefined] ]; arr.forEach((sub, idx) => { const { startIndex, endIndex, trimmedArr } = getTrimIndexes(sub) console.log(`子数组${idx}:start=${startIndex}, end=${endIndex}`, 裁剪结果:, trimmedArr) })
输出完全符合你的示例要求:
- 子数组0:start=0, end=6,无需裁剪
- 子数组1:start=0, end=6,无需裁剪
- 子数组2:start=1, end=6,裁剪掉头部第0位
- 子数组3:start=2, end=3,裁剪掉头部前2位、尾部后3位
简化方案(ES2022+环境支持)
如果你的运行环境兼容ES2022,可以直接用原生的findLastIndex方法,代码更简洁:
function getTrimIndexes(subArr) { const startIndex = subArr.findIndex(isValid) if (startIndex === -1) return { startIndex: -1, endIndex: -1, trimmedArr: [] } const endIndex = subArr.findLastIndex(isValid) return { startIndex, endIndex, trimmedArr: subArr.slice(startIndex, endIndex + 1) } }
内容的提问来源于stack exchange,提问作者oderfla
相关产品推荐
相关产品推荐

