JavaScript中是否有类似parentNode的方法可获取对象属性的父级键名?
JavaScript 中如何通过子属性获取父级对象键名
原生 JavaScript 的普通对象没有内置父级引用机制,属性值本身不会存储所属上层对象的关联信息,无法直接通过子属性拿到父级对象,以下是两种可行的实现方案:
方案1:递归遍历查找(无需修改原对象)
如果你可以拿到嵌套对象的根节点,且仅需要一次性查找对应父级键名,可以直接递归遍历根对象匹配目标属性:
// 示例对象 const house = { bedroom: { bed: 'I am a bed' }, kitchen: { table: 'I am a table' } } /** * 查找目标属性所属的父级键名 * @param {object} root 嵌套对象根节点 * @param {string} targetKey 目标属性的键名 * @param {any} targetValue 目标属性的值 * @returns {string|null} 父级键名,未找到返回null */ function findParentKey(root, targetKey, targetValue) { for (const key in root) { const currentValue = root[key] // 仅处理值为对象的节点,父级节点一定是对象类型 if (typeof currentValue === 'object' && currentValue !== null) { // 匹配到目标属性直接返回当前键 if (currentValue[targetKey] === targetValue) { return key } // 递归查找深层嵌套 const nestedResult = findParentKey(currentValue, targetKey, targetValue) if (nestedResult) return nestedResult } } return null } // 调用示例 console.log(findParentKey(house, 'bed', 'I am a bed')) // 输出:bedroom
适用场景:不需要频繁访问父级、不想修改原对象结构的场景。注意如果对象层级过深、属性过多会有一定性能损耗。
方案2:内置父级引用(支持类似parentNode调用)
如果需要频繁访问父级,可以给所有嵌套对象手动绑定父级引用,实现类似DOM的parentNode效果:
/** * 给所有嵌套对象添加parentNode引用 * @param {object} obj 要处理的对象 * @param {object|null} parent 父级对象引用 * @returns {object} 处理后的带父引用的对象 */ function addParentRef(obj, parent = null) { obj.parentNode = parent for (const key in obj) { const value = obj[key] // 跳过已经绑定过引用的对象,避免循环处理 if (typeof value === 'object' && value !== null && !value.parentNode) { addParentRef(value, obj) } } return obj } /** * 获取当前对象在父级中的键名 * @param {object} childObj 子对象 * @returns {string|null} 父级键名 */ function getParentKey(childObj) { const parent = childObj.parentNode if (!parent) return null for (const key in parent) { if (parent[key] === childObj) return key } return null } // 给示例对象绑定父引用 const houseWithParent = addParentRef(house) // 调用示例 console.log(houseWithParent.bedroom.bed.parentNode === houseWithParent.bedroom) // 输出:true console.log(getParentKey(houseWithParent.bedroom)) // 输出:bedroom
适用场景:需要频繁访问父级的场景。注意该方案会给对象新增额外属性,存在循环引用问题,序列化对象时需要过滤parentNode属性,避免报错,同时要注意不必要的引用导致的内存泄漏问题。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

