JavaScript嵌套对象数组:根据类型ID获取类别与类型组合字符串
解决方案:简化获取根类别+类型名称的实现
我来帮你搞定这个问题,同时把复杂的实现简化!核心思路是先做一次数据预处理,把类型ID和对应的根类别、类型名称直接关联起来,后续查询一步到位,既高效又好维护。
步骤1:预处理生成类型ID映射表
先遍历你的对象数组,把每个类型ID对应的根类别和类型名称存到一个映射对象里,后续查询直接用ID取值就行:
let obj = [ { "category": "Residential", "category_id": 1, "types": [ {"name": "House", "id": 1}, {"name": "Townhouse / Villa", "id": 3}, {"name": "House and Land", "id": 5}, {"name": "Duplex", "id": 4}, {"name": "Land", "id": 6}, {"name": "Terrace", "id": 7} // 假设这个Terrace的ID是7 ] }, { "category": "Rural", "category_id": 2, "types": [ {"name": "Terrace", "id": 8} // 你期望的Rural下的Terrace,假设ID是8 ] } ]; // 预处理生成映射表,把类型ID和对应的根类别、类型名绑定 const typeMap = {}; obj.forEach(categoryItem => { categoryItem.types.forEach(type => { typeMap[type.id] = { rootCategory: categoryItem.category, typeName: type.name }; }); });
步骤2:编写简洁的查询函数
有了映射表之后,查询逻辑就超级简单了,直接根据ID取对应数据然后拼接成需要的格式:
function getCombinedName(typeId) { const match = typeMap[typeId]; // 如果找不到对应ID,可以返回空字符串或者自定义提示 return match ? `${match.rootCategory} / ${match.typeName}` : '未找到对应的类型'; }
测试示例
比如查询你期望的Rural下的Terrace:
console.log(getCombinedName(8)); // 输出:Rural / Terrace
查询Residential下的Terrace:
console.log(getCombinedName(7)); // 输出:Residential / Terrace
这个方案的优势
- 高效:只需要预处理一次数组,后续每次查询都是O(1)的时间复杂度,数据量大的时候优势特别明显
- 简洁:逻辑清晰,代码量少,比反复遍历数组找数据的写法好维护太多
- 可复用:映射表可以全局复用,不用每次查询都重新遍历整个数组
内容的提问来源于stack exchange,提问作者sumit
相关产品推荐
相关产品推荐

