如何使用ES5语法在嵌套对象中查找特定属性并返回其值
如何用ES5语法在嵌套对象中查找指定属性并返回值?
先帮你排查下之前ES6代码的问题:当递归找到source属性时,你返回的是具体的属性值(比如"Spain"),但后续判断递归结果时用了=== true——如果属性值不是布尔值true,这个判断就不成立,程序会继续遍历其他属性,最后返回false,这就是明明存在属性却返回错误结果的原因。
接下来是符合你需求的ES5实现,核心思路是深度优先遍历整个嵌套对象结构,找到目标属性就返回它的值,遍历完所有层级都找不到就返回false:
function findPropertyValue(obj, targetKey) { // 先判断当前对象是否有效(null/undefined直接返回false) if (obj == null || typeof obj !== 'object') { return false; } // 遍历当前对象的所有键 var keys = Object.keys(obj); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = obj[key]; // 如果当前键就是目标键,直接返回对应的值 if (key === targetKey) { return value; } // 如果当前值是对象(排除null,因为typeof null === 'object'),递归查找 if (typeof value === 'object' && value !== null) { var result = findPropertyValue(value, targetKey); // 如果递归找到了值,就返回它(不用继续遍历剩余属性) if (result !== false) { return result; } } } // 所有层级都遍历完没找到目标属性,返回false return false; }
测试你的示例数据
我们用你提供的三个对象来验证这个函数的效果:
var first_data = { area: "South", code: "S265", info: { category: "enhanced", label: "AB | 27AS53", variable: "VR" }, list: { area: "Mid", details: [ { source: "Spain", totals: 12, products: [ { name: "ABC", brand: "Nobrand", id: "111", category: "Men", } ] } ] }, time: 1654775446138 }; var second_data = { area: "South", code: "S265", info: { category: "enhanced", label: "AB | 27AS53", variable: "VR" }, list: { area: "Mid", details: [ { products: [ { name: "ABC", brand: "Nobrand", id: "111", category: "Men", _new: { source: "Spain", totals: 12 } } ] } ] }, time: 1654775446138 }; var third_data = { area: "South", code: "S265", info: { category: "enhanced", label: "AB | 27AS53", variable: "VR" }, list: { area: "Mid", details: [ { products: [ { name: "ABC", brand: "Nobrand", id: "111", category: "Men" } ] } ] }, time: 1654775446138 }; console.log(findPropertyValue(first_data, 'source')); // 输出 "Spain" console.log(findPropertyValue(second_data, 'source')); // 输出 "Spain" console.log(findPropertyValue(third_data, 'source')); // 输出 false
关键细节说明
- 特殊值处理:单独判断
null和undefined,避免递归到无效值上 - 效率优化:递归找到结果后立即返回,无需遍历剩余属性
- 纯ES5语法:使用
var声明变量、普通for循环遍历键数组,完全兼容ES5环境
内容的提问来源于stack exchange,提问作者rimed
相关产品推荐
相关产品推荐

