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"]
为之则易,不为则难。