如何高效处理嵌套数组遍历,修改指定id元素的isValid属性
多层嵌套数组属性更新优化方案
核心优化点
- 将
invalidIds转换为Set类型,将id存在性查询的时间复杂度从O(n)降低到O(1),无效id数量越多性能提升越明显 - 嵌套层级固定的场景下,直接分层遍历即可,没有额外开销;嵌套层级动态变化的场景下用递归避免重复写多层遍历代码
固定层级场景实现(性能最优)
这种写法没有额外的递归调用开销,可读性最高,适合当前固定2层嵌套的场景:
// 转换为Set优化查询效率 const invalidIdSet = new Set(invalidIds); data.forEach(lvl1 => { lvl1.level1arr.forEach(lvl2 => { lvl2.level2arr.forEach(element => { if (invalidIdSet.has(element.id)) { element.isValid = false; } }); }); });
动态嵌套层级通用实现
如果后续嵌套层级会变化,不想每次修改遍历代码,可以用递归实现通用遍历:
const invalidIdSet = new Set(invalidIds); function updateValidStatus(node) { // 匹配到目标节点就更新属性 if (node.id !== undefined && node.isValid !== undefined) { node.isValid = !invalidIdSet.has(node.id); return; } // 遍历所有数组属性递归处理 Object.values(node).forEach(val => { Array.isArray(val) && val.forEach(item => updateValidStatus(item)); }); } data.forEach(item => updateValidStatus(item));
性能说明
多层forEach本身并不会带来额外的性能损耗,这类场景的理论最低时间复杂度就是O(m)(m为所有待校验的目标元素总数量),因为你必须遍历所有目标元素判断id是否无效。之前写法的性能瓶颈实际是
Array.includes的线性查询,替换为Set.has即可解决90%以上的性能问题。
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

