如何在JSON对象数组中查找匹配特定值?代码重构咨询
重构JSON遍历,高效按属性查询Item的方案
兄弟,我太懂你这种“代码能跑但看着闹心,想重构又摸不着头绪”的感觉了!用嵌套for-in遍历JSON拿item对象虽然可行,但确实不够优雅,而且没法高效定位特定属性的item——咱们直接用JavaScript数组的内置方法或者递归收集来重构,绝对清爽很多!
先给你两种核心重构思路,对应不同的JSON结构:
情况1:你的JSON是数组嵌套数组结构(比如分组包含items数组)
假设你的数据大概长这样:
const yourData = { category1: { items: [{ id: 1, title: '笔记1' }, { id: 2, title: '笔记2' }] }, category2: { items: [{ id: 3, title: '笔记3' }] } };
原来的for-in写法可能是嵌套两层,现在咱们先把所有item一次性提取成一个扁平数组,之后想查啥都方便:
// 第一步:把所有item提取到一个数组里 const allItems = Object.values(yourData) // 先拿到所有分类的value .flatMap(category => category.items); // 把每个分类的items打平合并 // 第二步:按特定属性查询就简单了! // 找id=2的item const targetItem = allItems.find(item => item.id === 2); // 找所有title包含"笔记"的item const matchedItems = allItems.filter(item => item.title.includes('笔记'));
这种写法是声明式编程,一眼就能看懂要做什么,比嵌套循环可读性高太多,而且数组方法都是经过优化的,性能也不差。
情况2:你的JSON是多层嵌套的对象(不是数组,比如深层嵌套的键值对)
如果你的item藏在多层对象里,不是数组结构,那咱们写个递归函数来收集所有item:
// 递归收集所有名为"item"的对象 function gatherAllItems(obj) { let items = []; for (const key in obj) { // 跳过原型链上的属性(避免for-in的坑) if (!obj.hasOwnProperty(key)) continue; const value = obj[key]; if (typeof value === 'object' && value !== null) { if (key === 'item') { // 找到item就加入数组 items.push(value); } else { // 没找到就继续递归遍历子对象 items = items.concat(gatherAllItems(value)); } } } return items; } // 使用示例 const allItems = gatherAllItems(yourJsonObject); // 同样用find/filter查询 const specificItem = allItems.find(item => item.yourTargetProperty === 'desiredValue');
这个递归函数能帮你把所有深层的item都捞出来,之后查询逻辑和第一种情况完全一致。
为啥要这么重构?
- 可读性拉满:别人看代码不用跟着嵌套循环绕圈圈,一眼就知道你要收集所有
item然后查特定数据 - 复用性强:提取出
allItems之后,不管你要查多少次不同属性,都不用再重新遍历整个JSON - 避免
for-in的坑:for-in会遍历对象原型链上的属性,一不小心就会拿到意外的值,用Object.values或者加hasOwnProperty能避开这个问题
如果你的JSON结构或者那个没写完的函数有更具体的细节,可以补充出来,我再帮你调整方案!
内容的提问来源于stack exchange,提问作者James-Jesse Drinkard
相关产品推荐
相关产品推荐

