JavaScript 树状数组根据子节点查找所有父节点

const findPatentValue = (array, value, valueName = 'value', childrenName = 'children') => {
    if (!value || !Array.isArray(array)) return []
    const result = []
    let valid = false
    const seek = (array, value) => {
        let parentValue = ''
        const up = (array, value, lastValue) => {
            array.forEach(v => {
                const val = v[valueName]
                const child = v[childrenName]
                if (val === value) {
                    valid = true
                    parentValue = lastValue
                    return
                }
                if (child && child.length) up(child, value, val)
            })
        }
        up(array, value)
        if (parentValue) {
            result.unshift(parentValue)
            seek(array, parentValue)
        }
    }
    seek(array, value)
    return valid ? [...result, value] : []
}

Test

const array = [
    {
        value: 'A',
        children: [
            {
                value: '_A1',
                children: [
                    {
                        value: '__A1'
                    }
                ]
            },
            {
                value: '_A2'
            }
        ]
    },
    {
        value: 'B',
        children: [
            {
                value: '_B1'
            },
            {
                value: '_B2',
                children: [
                    {
                        value: '__B2',
                        children: [
                            {
                                value: '___B2',
                                children: [
                                    {
                                        value: '____B2'
                                    }
                                ]
                            }
                        ]
                    }
                ]
            },
            {
                value: '_B3',
                children: [
                    {
                        value: '__B3',
                        children: [
                            {
                                value: '___B3',
                            }
                        ]
                    }
                ]
            }
        ]
    }
]

console.log(findParent(array, '___B2')) // => ["B", "_B2", "__B2", "___B2"]

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这是一个比较常见的树形结构处理问题,以下是一种可能的实现方式: ```javascript function buildTree(data) { const idMap = new Map(); // 用 Map 存储节点 id 和对应的节点对象 const rootNodes = []; // 存储根节点 // 第一次遍历,将每个节点存入 Map 中 for (const node of data) { node.children = []; // 初始化节点数组 idMap.set(node.id, node); // 存储节点对象 } // 第二次遍历,构建树形结构 for (const node of data) { const parentId = node.parentId; if (parentId === null || !idMap.has(parentId)) { // 没有节点节点未出现在数据中,将其作为根节点 rootNodes.push(node); } else { // 找到节点,将当前节点作为节点添加到节点下 const parent = idMap.get(parentId); parent.children.push(node); } } return rootNodes; } ``` 这个函数接受一个一维数组 `data`,每个元素都应该包含 `id` 和 `parentId` 两个属性,表示节点的唯一标识和节点的唯一标识。如果一个节点没有节点,其 `parentId` 应该为 `null`。 函数首先创建一个 `Map` 对象 `idMap`,用于存储节点 id 和对应的节点对象。然后遍历一遍原始数据,将每个节点存入 `idMap` 中,并初始化每个节点的 `children` 属性为空数组。 第二次遍历原始数据,构建树形结构。如果当前节点没有节点节点未出现在数据中,将其作为根节点添加到 `rootNodes` 数组中。否则,找到节点,将当前节点作为其节点添加到 `children` 数组中。最后返回 `rootNodes` 数组即可。 注意,这个函数的实现方式可能不是最优的,具体实现方式可以根据具体需求和数据结构来选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值