Проблема, с которой я столкнулся, состоит в том, чтобы найти листовой узел в дереве (не в двоичном дереве), который необходимо изменить; Я должен вычислить blake2b ha sh из данных листа, передать это родителю, а затем вычислить blake2b ha sh этого и так далее, пока я не достигну узла root, затем я вычислю то же самое для root node.
Начальные интерфейсы и конечный интерфейс приведены ниже:
interface sto {
name: string
children: sto[]
}
interface stoWithIds {
id: string // blake2b(data)
data: {
name: string
children: stoWithIds[]
}
}
функции, которые мне нужны:
function transformSto (op: sto): stoWithIds {
const { children, ...rest } = op
return { id: '', data: { ...rest, children: [] } }
}
async function visitNode (node: sto, parent: stowithId) {
// this will start executing when the leaf is found then go upwards
node.children.map(async c => await visitNode(node, parent))
// here be creating the ids
parent.children.push(/* our calculation, but this doesn't work for children on the same level*/)
}
, тогда я бы назвал его
const sto: sto = {
name: 'Root',
children: [
{
name: 'child 1',
children: [
{
name: 'child2',
children: []
},
{
name: 'child3',
children: []
}
]
}
]
}
await visitNode(sto, transformSto(sto))
то, что я могу получить после того, как это будет выполнено, это следующее:
const stowithId: stoWithIds = {
id: 'blake2b(data)',
data: {
name: 'Root',
children: [
{
id: 'blake2b(data)',
data: {
name: 'child 1',
children: [
{
id: 'blake2b(data)',
data: {
name: 'child2',
children: []
}
},
{
id: 'blake2b(data)',
data: {
name: 'child3',
children: []
}
}
]
}
}
]
}
}
Я боролся с этим много часов. Я уверен, что есть простое решение этой проблемы, но я не вижу его. Я не очень хорошо знаком с обходом деревьев, поэтому большую часть воскресенья я читал об этом, но до сих пор не могу этого понять. Любая помощь приветствуется.