如何在JSON对象中快速定位特定key对应的指定value的位置
高效查找有序数组目标位置的实现方案
现有代码存在的问题
你当前的递归实现存在几个明显的缺陷,也是性能差、逻辑不稳定的核心原因:
- 操作符误用:判断条件中使用了赋值符
=而非全等判断符===,会直接修改原数组内容,导致判断逻辑完全错误 - 无边界校验:如果数组中不存在
value2,会无限递归直到调用栈溢出,直接抛出异常 - 性能损耗高:递归本身的调用栈开销远高于普通循环,且你使用的逐一遍历方案时间复杂度为O(n),数组体量越大耗时越高
最优实现方案
因为你明确说明数组是按值顺序排列的,所有value1都出现在value2之前,属于二分类有序结构,完全可以使用二分查找将时间复杂度降到O(log n),在超大数组场景下性能提升可达上千倍:
// 返回第一个key为value2的元素下标,未找到返回-1 function findFirstValue2(obj) { const exampleArr = obj.examples; let left = 0; let right = exampleArr.length - 1; let targetIndex = -1; // 先快速判断是否存在value2 if (exampleArr[right].key !== 'value2') return targetIndex; while (left <= right) { const mid = Math.floor((left + right) / 2); if (exampleArr[mid].key === 'value2') { targetIndex = mid; // 往左收缩范围,找第一个出现的value2 right = mid - 1; } else { // 当前还在value1区间,往右查找 left = mid + 1; } } return targetIndex; } // 调用示例 const parseData = JSON.parse(rawJson); const resultIndex = findFirstValue2(parseData); if (resultIndex !== -1) { console.log('第一个value2的位置:', resultIndex); console.log('对应元素:', parseData.examples[resultIndex]); }
额外优化建议
如果业务中需要多次查找同一个数组的不同值,可以提前为数组构建值到下标的索引缓存,后续查找可以直接O(1)命中,不需要重复执行查找逻辑。
内容的提问来源于stack exchange,提问作者Sigsby
相关产品推荐
相关产品推荐

