一个简单的更改JSON结构问题,(是的非常简单)

{
    name:'a',
    child:{
        name:'b',
        child:{
            name:'c',
        },
        nodes:[
        {
            name:'e'
        },{
            name:'f',
            child:{
                name:'g'
            }
        }]
    }
}

比如说我获取到了一个JSON,目前结构是这个样子的。我想让结构变成下面那种格式要怎么办呢。
更改数据格式的,看的我头痛啊

{
    name:'a',
    form:'b', // 指向child子节点的name
    child:{
        name:'b',
        form:['e','f'], // 当有nodes的时候使用数组存放node节点的name
        child:{
            name:'c',
        },
        nodes:[
        {
            name:'e',
            form:'c' // 没有指向上个 nodes 对象的子节点
        },{
            name:'f',
            from:'g', // 有子节点指向子节点
            child:{
                name:'g' // 没有指向上个 nodes 对象的子节点
                form:'c'
            }
        }]
    }
}
阅读 1.8k
2 个回答

image.png

{
var obj = {
    name:'a',
    child:{
        name:'b',
        child:{
            name:'c',
        },
        nodes:[
        {
            name:'e'
        },{
            name:'f',
            child:{
                name:'g'
            }
        }]
    }
}

var forSetTree = (obj,form='') => (obj.form = obj.nodes ? obj.nodes.map(item => forSetTree(item, obj.child.name)) : obj.child ? forSetTree(obj.child, form) : form, obj.name);
forSetTree(obj);
console.log(JSON.stringify(obj,null, '\t')) // 按tab缩进
}
VM143:23 {
    "name": "a",
    "child": {
        "name": "b",
        "child": {
            "name": "c"
        },
        "nodes": [
            {
                "name": "e",
                "form": "c"
            },
            {
                "name": "f",
                "child": {
                    "name": "g",
                    "form": "c"
                },
                "form": "g"
            }
        ],
        "form": [
            "e",
            "f"
        ]
    },
    "form": "b"
}
function deepSetForm(node, parent=node, isNodes) {
    if(node.nodes) {
        node.form = node.nodes.map(v => (deepSetForm(v, node, true), v.name))
    } else if(node.child) {
        node.form = node.child.name;
    } else if(isNodes){
        node.form = parent.child.name
    }
    node.child &&    deepSetForm(node.child, isNodes ? parent : node, isNodes);
    return node
}

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题