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 = null
        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"]

posted @ 2021-01-19 14:49  demo_you  阅读(519)  评论(0编辑  收藏  举报