我试图找出一种有效的方法来改变树结构中所有叶节点的值,当说叶子节点可以处于任何级别时。我看了一下这些例子:
Looping through nested array of objects
How to find the leaf nodes with recursion in javascript?
Recursively find all children from parent menu
how to change the property value of an object nested in a tree of nodes?
并设法拼凑出一种对任何深度都有效的东西,直到一个硬编码的极限。我列出的最后一个链接看起来非常接近我所需的内容,但是我无法调整该代码来处理我的数据结构。到目前为止,我得到的是:
const data = {
"name": "Root",
"children": [{
"name": "JAN",
"children": [{
"name": "Things1",
"value": 2
},
{
"name": "Things2",
"value": 4
}
]
},
{
"name": "Sept",
"children": [{
"name": "things3",
"value": 2
}]
},
{
"name": "OCT",
"children": [{
"name": "Day1",
"value": 5
},
{
"name": "Month",
"children": [{
"name": "Day 2",
"value": 3
},
{
"name": "Day3",
"value": 4
},
{
"name": "Day4",
"value": 6
},
{
"name": "Day5",
"value": 2
},
{
"name": "Day 6",
"value": 5
},
{
"name": "Day7",
"value": 2
},
{
"name": "Day 8",
"value": 7
},
{
"name": "number 9",
"value": 5
},
{
"name": "Stuff",
"value": 6
},
{
"name": "Things",
"value": 2
},
{
"name": "Moar nonsense",
"value": 2
},
{
"name": "Planes fly high",
"value": 4
},
{
"name": "Crossfit",
"value": 7
},
{
"name": "Anothert",
"value": 3
},
{
"name": "Granade",
"value": 4
},
{
"name": "Purpose",
"value": 2
}
]
},
{
"name": "Week 3",
"children": [{
"name": "Front",
"value": 1
},
{
"name": "Position",
"value": 5
},
{
"name": "Operate",
"value": 6
},
{
"name": "Back",
"value": 4
},
{
"name": "Dragon",
"value": 6
},
{
"name": "Ogre",
"value": 5
}
]
},
{
"name": "Lair Actions",
"children": [{
"name": "Use",
"value": 1
},
{
"name": "Posion",
"value": 5
},
{
"name": "Difficult Terrain",
"value": 6
},
{
"name": "Fireball",
"value": 4
}
]
},
{
"name": "One Shot",
"value": 5
}
]
}
]
}
let messagearry = data.children
function setVals(messagearry) {
const valueScale = 100;
// console.log(messagearry[0])
// messagearry.forEach(data => {
// console.log("testing")
// console.log(data.children)
// setVals(data.children)
// })
let leafnum = 0;
function findDuplicates(arr) {
return arr.filter((currentValue, currentIndex) =>
arr.indexOf(currentValue) !== currentIndex);
}
console.log(findDuplicates(data2))
//below this works but only for 4 levels. If we have more than that it won't work
Object.keys(messagearry).forEach((key) => {
const childrenArray = messagearry[key].children;
Object.keys(childrenArray).forEach((key, index) => {
if (!isNaN(childrenArray[key].value)) {
childrenArray[key].value = childrenArray[key].value * valueScale
}
console.log("high level " + childrenArray[key].value)
if (isNaN(childrenArray[key].value)) {
let whatever = childrenArray[key].children
whatever.forEach(key => {
key.value = key.value * valueScale
})
}
})
})
}
setVals(messagearry)必须有一种更好、不那么死板的方法来做到这一点,但我在递归方面真的很差,而且javascript不是我最好的语言。
发布于 2022-11-30 23:46:01
假设“叶子”是指所有没有孩子的物体,而孩子的道具是同音词。假设树是一个由相同形状的对象组成的数组(因此子键总是相同的)。
递归非常容易,只是有点棘手。
基本上,我为一个对象的所有子对象做了一个重复的过程。如果没有,我只是将值设置为您在开头决定的值(所有叶相同),如果存在当前数组的下一个对象,或者退出该函数。子项的属性名和值是参数化的,因此它具有一定的动态性。
function setLeaf (tree = [], newValue, childLabel, valueLabel) {
for (const item of tree.values()) {
if (item[childLabel]?.length) { // optional chaining children doesn't exist or empty array
setLeaf(item[childLabel], newValue, childLabel, valueLabel);
} else {
item[valueLabel] = newValue;
}
}
}
setLeaf(data.children, 'LEAF', 'children', 'value');
const data = {
name: 'Root',
children: [{
name: 'JAN',
children: [{
name: 'Things1',
value: 2
},
{
name: 'Things2',
value: 4
}
]
},
{
name: 'Sept',
children: [{
name: 'things3',
value: 2
}]
},
{
name: 'OCT',
children: [{
name: 'Day1',
value: 5
},
{
name: 'Month',
children: [{
name: 'Day 2',
value: 3
},
{
name: 'Day3',
value: 4
},
{
name: 'Day4',
value: 6
},
{
name: 'Day5',
value: 2
},
{
name: 'Day 6',
value: 5
},
{
name: 'Day7',
value: 2
},
{
name: 'Day 8',
value: 7
},
{
name: 'number 9',
value: 5
},
{
name: 'Stuff',
value: 6
},
{
name: 'Things',
value: 2
},
{
name: 'Moar nonsense',
value: 2
},
{
name: 'Planes fly high',
value: 4
},
{
name: 'Crossfit',
value: 7
},
{
name: 'Anothert',
value: 3
},
{
name: 'Granade',
value: 4
},
{
name: 'Purpose',
value: 2
}
]
},
{
name: 'Week 3',
children: [{
name: 'Front',
value: 1
},
{
name: 'Position',
value: 5
},
{
name: 'Operate',
value: 6
},
{
name: 'Back',
value: 4
},
{
name: 'Dragon',
value: 6
},
{
name: 'Ogre',
value: 5
}
]
},
{
name: 'Lair Actions',
children: [{
name: 'Use',
value: 1
},
{
name: 'Posion',
value: 5
},
{
name: 'Difficult Terrain',
value: 6
},
{
name: 'Fireball',
value: 4
}
]
},
{
name: 'One Shot',
value: 5
}
]
}
]
};
function setLeaf (tree = [], newValue, childLabel, valueLabel) {
for (const item of tree.values()) {
if (item[childLabel]?.length) {
setLeaf(item[childLabel], newValue, childLabel, valueLabel);
} else {
item[valueLabel] = newValue;
}
}
}
setLeaf(data.children, 'LEAF', 'children', 'value');
console.log(data);
https://stackoverflow.com/questions/74634951
复制相似问题