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

如何用单循环实现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 }]

逻辑说明

  1. 暂存小于目标值的元素:用tempLess数组记录所有ID小于给定值的对象,方便后续取出最后一个(最大的)符合条件的元素;
  2. 触发收集逻辑:当遇到第一个ID大于给定值的对象时,先将tempLess的最后一个元素加入结果,再加入当前对象,接着一次性处理剩余所有元素(过滤掉ID等于给定值的),避免重复遍历;
  3. 边界处理:如果整个数组中没有ID大于给定值的对象,直接将所有暂存的小于给定值的对象加入结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 11:44:53