如何从JavaScript嵌套对象数组中根据子节点获取其父节点?
嵌套JS对象数组中根据子节点查找父节点
我有一个嵌套结构的JavaScript对象数组(如下),需要找到{ name: 'Charge Type 1.2' }这个子节点对应的父节点。之前试过用hasChildNodes()方法,但完全没用——后来才反应过来这是DOM节点专属方法,根本不适用于普通JS对象。期望返回的父节点是指定的包含Charge Type 1的对象。
原嵌套对象数组
const table = [ { name: 'A1 - John Doe', icon: 'user-name', bold: true, code: 'NY', open: false, items: [ { name: 'D3_AIR_ASBJHABSJAS', icon: 'package', open: false, items: [ { name: 'Charge Type 1', open: false, items: [ { name: 'Charge Type 1.1', icon: 'departure-nofill', date: '12/10/2024' }, { name: 'Charge Type 1.2'}, { name: 'Charge Type 1.3'}, { name: 'Charge Type 1.4', items: [ { name: 'Charge Type 2.1'}, { name: 'Charge Type 2.2'}, { name: 'Charge Type 2.3'}, ] }, ] }, { name: 'Charge Type 2', open: false, items: [ { name: 'Charge Type 2.1'}, { name: 'Charge Type 2.2'}, { name: 'Charge Type 2.3', items: [ { name: 'Charge Type 2.1.1'}, ] }, ] }, { name: 'Charge Type 3', items: [ { name: 'Charge Type 3.1'}, ] }, ] }, { name: 'Hotel Beach Park', icon: 'departure-nofill', date: '12/10/2024' } ] }, {name: '567', code: 'NYF', items: [ { name: 'Charge Type 3.1'}, ] }, ];
期望返回的父节点
{ name: 'Charge Type 1', open: false, items: [ { name: 'Charge Type 1.1', icon: 'departure-nofill', date: '12/10/2024' }, { name: 'Charge Type 1.2'}, { name: 'Charge Type 1.3'}, { name: 'Charge Type 1.4', items: [ { name: 'Charge Type 2.1'}, { name: 'Charge Type 2.2'}, { name: 'Charge Type 2.3'}, ] }, ] }
解决方案:递归遍历查找
针对这种多层嵌套结构,用递归遍历的方式可以精准定位父节点:
function findParentNode(arr, targetName) { for (const node of arr) { // 检查当前节点是否包含子节点列表 if (node.items && Array.isArray(node.items)) { // 验证当前节点的直接子节点是否匹配目标 const hasTarget = node.items.some(child => child.name === targetName); if (hasTarget) { return node; } // 递归遍历子节点的下一层级 const result = findParentNode(node.items, targetName); if (result) { return result; } } } // 未找到匹配的父节点时返回null return null; } // 调用示例 const targetParent = findParentNode(table, 'Charge Type 1.2'); console.log(targetParent);
这个函数会逐层遍历嵌套数组,一旦找到包含目标子节点的父节点就立即返回,完全适配这种多层嵌套的结构。如果需要更灵活的匹配规则(比如不是仅通过name匹配),可以把匹配逻辑改成传入回调函数,替换掉child.name === targetName这部分即可。
内容的提问来源于stack exchange,提问作者ramesh
相关产品推荐
相关产品推荐

