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

如何根据指定ID列表快速切换对象数组中对应项的布尔属性值

最优实现方案

针对你的需求,推荐两种不同场景下的高效实现,核心思路都是利用Set/Map的O(1)查找特性,避免数组遍历的高时间复杂度:

场景1:仅单次执行切换操作

如果这个切换逻辑只需要执行一次,直接将传入的ID列表转为Set后遍历原数组即可,时间复杂度为O(n + k)(n为原数组长度,k为传入ID列表长度):

/**
 * 切换指定ID对象的selected属性
 * @param {Array} markers 原对象数组
 * @param {Array} targetIdList 待切换的ID列表
 * @param {Boolean} immutably 是否返回新数组不修改原数据,默认false
 */
function toggleSelected(markers, targetIdList, immutably = false) {
  const idSet = new Set(targetIdList);
  if (immutably) {
    return markers.map(marker => 
      idSet.has(marker.id) 
        ? {...marker, selected: !marker.selected} 
        : marker
    );
  }
  markers.forEach(marker => {
    if (idSet.has(marker.id)) marker.selected = !marker.selected;
  });
}

场景2:需要频繁执行切换操作

如果这个切换逻辑会多次调用,可以提前给原数组构建ID到对象的映射表,后续每次操作的时间复杂度仅为O(k),不需要遍历全部7600条数据:

// 初始化阶段仅执行一次,构建ID映射
const markerMap = new Map(markers.map(item => [item.id, item]));

/**
 * 高频切换专用方法,仅遍历传入的ID列表
 * @param {Array} targetIdList 待切换的ID列表
 */
function toggleSelectedFast(targetIdList) {
  targetIdList.forEach(id => {
    const marker = markerMap.get(id);
    if (marker) marker.selected = !marker.selected;
  });
}

性能对比

  • 不做优化直接用Array.includes判断的方案时间复杂度为O(n*k),7600条数组+2000条ID列表的场景下需要做约1500万次匹配,性能最差
  • 转Set后遍历的方案单次仅需执行约9600次操作,性能提升非常明显
  • 提前构建Map的方案单次仅需2000次操作,适合高频调用场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:39:02