У меня есть две древовидные структуры: одна - это исходное дерево, которое содержит все листья, другая - CALLED selected
, это просто копия исходного дерева и отсутствуют некоторые листья, мне нужно сравнить исходное дерево и selected
и получить выводТо же, что и источник, но просто обновите листы, сравнив его с selected
.Как и любой исходный лист содержит тех же самых потомков, я хочу обновить исходный лист с помощью state: full
.Если ни один из дочерних элементов не выбран, состояние state: no
, если выбрано несколько дочерних элементов state: partial
.
Я попытался преобразовать выбранное дерево в массив идентификаторов, чтобы я мог сопоставить выбранные с source
., но я застрял в логике обновления выходного дерева.пожалуйста, проверьте мой ожидаемый результат.
const recursCollectIds = ({tree}) => {
return (tree || [])
.map(leaf => { return (leaf.children && leaf.children.length) ? [leaf.id].concat(recursCollectIds({tree: leaf.children})) : [leaf.id] } )
.flatMap(x => x)
}
const selected = [{
id: 4,
name: 'F',
children: [{
id: 8,
name: 'V',
children: []
}, {
id: 9,
name: 'T',
children: []
}]
},
{
id: 5,
name: 'B',
children: [{
id: 17,
name: 'R',
children: []
}]
},
{
id: 7,
name: 'O',
children: [{
id: 90,
name: 'Y',
children: [{
id: 37,
name: 'FU',
children: []
}]
}]
}
]
const source = [{
id: 4,
name: 'F',
children: [{
id: 8,
name: 'V',
children: [{
id: 3,
name: 'F',
children: []
}]
}, {
id: 9,
name: 'T',
children: []
}]
},
{
id: 5,
name: 'B',
children: [{
id: 17,
name: 'R',
children: []
}]
},
{
id: 7,
name: 'O',
children: [{
id: 90,
name: 'Y',
children: [{
id: 37,
name: 'FU',
children: []
}]
}]
}
]
const updateTree = ({source, selected}) => {
const selectedIds = recursCollectIds({tree: selected})
// need to check with ids of selected and source tree
}
updateTree({source, selected})
Ожидаемый результат
const out = [{
state: 'partial', // due to its children or grand children is selected partially
id: 4,
name: 'F',
children: [{
state: 'partial', // due to its children or grand children is selected partially
id: 8,
name: 'V',
children: [{
state: 'no', // due to non of its children selected
id: 3,
name: 'F',
children: []
}]
}, {
state: 'full', // no children so no need to match.
id: 9,
name: 'T',
children: []
}]
},
{
state: 'full',
id: 5,
name: 'B',
children: [{
state: 'full',
id: 17,
name: 'R',
children: []
}]
},
{
state: 'full',
id: 7,
name: 'O',
children: [{
state: 'full',
id: 90,
name: 'Y',
children: [{
state: 'full',
id: 37,
name: 'FU',
children: []
}]
}]
}
]