如何用单循环实现JavaScript对象数组的特定条件过滤?
单循环实现特定条件的JavaScript对象数组过滤
注:从你的示例来看,原需求描述可能存在笔误,实际需要的是:排除所有ID等于给定值的对象,同时仅保留最后一个ID小于给定值的对象及之后的所有元素。以下是满足该需求的单循环实现方案,时间复杂度为O(n),每个元素仅被访问一次。
代码实现
const arr = [{ id: 10 }, { id: 20 }, { id: 30 }, { id: 40 }, { id: 50 }, { id: 60 }]; const myID = 25; const result = []; const tempLess = []; for (let i = 0; i < arr.length; i++) { const item = arr[i]; // 跳过ID等于目标值的对象 if (item.id === myID) continue; if (item.id < myID) { // 暂存所有小于目标ID的元素 tempLess.push(item); } else { // 遇到第一个大于目标ID的元素: // 1. 加入最后一个小于目标ID的元素(如果有) if (tempLess.length > 0) { result.push(tempLess[tempLess.length - 1]); } // 2. 加入当前元素 result.push(item); // 3. 遍历剩余元素,直接加入(跳过等于目标ID的) for (let j = i + 1; j < arr.length; j++) { const nextItem = arr[j]; if (nextItem.id !== myID) { result.push(nextItem); } } // 跳出外层循环,结束遍历 break; } } // 如果遍历完所有元素都没找到大于目标ID的,就把所有小于的元素加入结果 if (result.length === 0) { result.push(...tempLess); } console.log(result); // 输出: [{ id: 20 }, { id: 30 }, { id: 40 }, { id: 50 }, { id: 60 }]
逻辑说明
- 暂存小于目标值的元素:用
tempLess数组记录所有ID小于给定值的对象,方便后续取出最后一个(最大的)符合条件的元素; - 触发收集逻辑:当遇到第一个ID大于给定值的对象时,先将
tempLess的最后一个元素加入结果,再加入当前对象,接着一次性处理剩余所有元素(过滤掉ID等于给定值的),避免重复遍历; - 边界处理:如果整个数组中没有ID大于给定值的对象,直接将所有暂存的小于给定值的对象加入结果。
内容的提问来源于stack exchange,提问作者bigmak123
相关产品推荐
相关产品推荐

