如何根据指定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
相关产品推荐
相关产品推荐

