首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Javascript在嵌套数据结构中修改叶的值

如何使用Javascript在嵌套数据结构中修改叶的值
EN

Stack Overflow用户
提问于 2022-11-30 22:35:19
回答 1查看 30关注 0票数 0

我试图找出一种有效的方法来改变树结构中所有叶节点的值,当说叶子节点可以处于任何级别时。我看了一下这些例子:

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?

并设法拼凑出一种对任何深度都有效的东西,直到一个硬编码的极限。我列出的最后一个链接看起来非常接近我所需的内容,但是我无法调整该代码来处理我的数据结构。到目前为止,我得到的是:

代码语言:javascript
复制
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不是我最好的语言。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-30 23:46:01

假设“叶子”是指所有没有孩子的物体,而孩子的道具是同音词。假设树是一个由相同形状的对象组成的数组(因此子键总是相同的)。

递归非常容易,只是有点棘手。

基本上,我为一个对象的所有子对象做了一个重复的过程。如果没有,我只是将值设置为您在开头决定的值(所有叶相同),如果存在当前数组的下一个对象,或者退出该函数。子项的属性名和值是参数化的,因此它具有一定的动态性。

代码语言:javascript
复制
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');

代码语言:javascript
复制
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);

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74634951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档