I came across a very strange problem in a recursive function. my code is as below:
tree_generator(startNode, dictionary) {
let resultNode = startNode
// find node name from dictionary
let hasChild = dictionary[resultNode.name]
? dictionary[resultNode.name].parts.length > 0
? true
: false
: false
if (hasChild) {
//create child node object
let children = _.map(dictionary[resultNode.name].parts, item => {
let childpart = {
id: 'd_' + item.name,
name: item.name,
children: [],
ontology_name: item.partIri.replace(/.*otl\//, '') // need to update to related uri value
}
this.level = this.level + 1
// recurve to get the result for child node
this.tree_generator(childpart, dictionary)
return childpart
})
console.log('real child')
console.log(children)
resultNode.children = children
console.log('real result node in tree')
console.log(resultNode)
} else {
//it is a leaf, delete child node
delete resultNode.children
}
return resultNode
}
When I pass a different dictionary parameter, the return result should be different, but actually, it always returns the same result with the last dictionary values.
When I console log the children and resultNode value, the children value is always right with the right dictionary, but the resultNode always assigns a different value than the real children.
Does anyone have any idea what did I do wrong here?
Testing data group: group1: startNode:
{
id: '0_d_TestOne',
name: 'TestOne',
children: [],
ontology_name: 'testOne'
}
dictionary:
{
TestOne: { uri: 'TestOne', parts: [{ name: 'testTwee', partIri: 'http://otl/testTee' }] },
testTwee: { uri: 'testTwee', parts: [{ name: 'testDrie', partIri: 'http://otl/testDrie' }] },
testDrie: { uri: 'testDrie', parts: [{ name: 'testVier', partIri: 'http://otl/testVier' }] },
testVier: { uri: 'testVier', parts: [{ name: 'TestVijf', partIri: 'http://otl/TestVijf' }] }
}
group2: startNode:
{
id: '0_d_TestOne',
name: 'TestOne',
children: [],
ontology_name: 'testOne'
}
dictionary:
{
TestOne: { uri: 'TestOne', parts: [{ name: 'TestTwo', partIri: 'http://otl/TestTwo' }] },
TestTwo: { uri: 'TestTwo', parts: [{ name: 'TestThree', partIri: 'http://otl/TestThree' }] },
TestThree: {
uri: 'TestThree',
parts: [{ name: 'TestFour', partIri: 'http://otl/TestFour' }]
},
TestFour: { uri: 'TestFour', parts: [{ name: 'TestFive', partIri: 'http://otl/TestFive' }] }
}
the start node is the same, the dictionary is different, the expected tree output should be different
async? There's nothing asynchronous in your code.this.level?