首页 > 平铺的json转树结构的json,请看数据

平铺的json转树结构的json,请看数据

{
    "name": "paragraph",
    "fullName": "paragraph",
    "description": "",
    "varType": "paragraph",
    "type": 4,
    "sampleIndex": 0
}, {
    "name": "$intf",
    "fullName": "paragraph.$intf",
    "description": "",
    "varType": "string",
    "type": 2,
    "sampleIndex": 0
}, {
    "name": "$mtu",
    "fullName": "paragraph.$mtu",
    "description": "",
    "varType": "int",
    "type": 1,
    "sampleIndex": 0
}, {
    "name": "$bw",
    "fullName": "paragraph.$bw",
    "description": "",
    "varType": "int",
    "type": 1,
    "sampleIndex": 0
}, {
    "name": "SubParagraph",
    "fullName": "paragraph.SubParagraph",
    "description": "",
    "varType": "paragraph",
    "type": 4,
    "sampleIndex": 0
}, {
    "name": "$subId",
    "fullName": "paragraph.SubParagraph.$subId",
    "description": "",
    "varType": "string",
    "type": 2,
    "sampleIndex": 0
}

利用fullName表示的关系,一个 . 代表一级
如何将上面的数据转换成类似下面的格式:

{
    name: "bgp_rid",
    type: "single",
    draggable: true
}, {
    name: "bgp_nbrs",
    type: "table",
    children: [{
        name: "bgp_rid1",
        type: "single",
        draggable: true
    }, {
        name: "bgp_nbrs1",
        type: "table",
        draggable: true
    }, {
        name: "bgp_nbrs1",
        type: "interface_table",
        children: [{
            name: "bgp_rid1",
            type: "single",
            draggable: true
        }, {
            name: "bgp_nbrs1",
            type: "table",
            draggable: true,
            children: [{
                name: "bgp_rid1",
                type: "single",
                draggable: true
            }, {
                name: "bgp_nbrs1",
                type: "table",
                draggable: true
            }]
        }]
    }]
}

https://stackoverflow.com/questions/18017869/build-tree-array-from-flat-array-in-javascript


这个好像能用

var arr = [{
    'name': 'paragraph',
    'fullName': 'paragraph',
    'description': '',
    'varType': 'paragraph',
    'type': 4,
    'sampleIndex': 0
}, {
    'name': '$intf',
    'fullName': 'paragraph.$intf',
    'description': '',
    'varType': 'string',
    'type': 2,
    'sampleIndex': 0
}, {
    'name': '$mtu',
    'fullName': 'paragraph.$mtu',
    'description': '',
    'varType': 'int',
    'type': 1,
    'sampleIndex': 0
}, {
    'name': '$bw',
    'fullName': 'paragraph.$bw',
    'description': '',
    'varType': 'int',
    'type': 1,
    'sampleIndex': 0
}, {
    'name': 'SubParagraph',
    'fullName': 'paragraph.SubParagraph',
    'description': '',
    'varType': 'paragraph',
    'type': 4,
    'sampleIndex': 0
}, {
    'name': '$subId',
    'fullName': 'paragraph.SubParagraph.$subId',
    'description': '',
    'varType': 'string',
    'type': 2,
    'sampleIndex': 0
}];

var result = arr.reduce(function(previous, item) {
    var levels = item.fullName.split('.');
    if (levels.length === 1) {
        item.children = [];
        previous.push(item);
    } else {
        levels
            .reduce(function(p, level) {
                var found = p.find(it => it.name === level);
                if (!found) {
                    return p;
                }
                if (!found.children) {
                    found.children = [];
                }
                return found.children;
            }, previous)
            .push(item);
    }
    return previous;
}, []);

console.log(result);

https://jsfiddle.net/hsfzxjy/973zgpzr/11/

function transform (data) {
    let result = [], map = {}
    
    data.sort((a, b) => {
        if (a.fullName>b.fullName)
            return 1
        else if (a.fullName<b.fullName)
            return -1
        else
            return 0
    })
    
    function getNearestAncestor (name) {
        let arr = name.split('.')
        
        for (let l = arr.length - 1; l > 0; l--) {
            let str = arr.slice(0, l).join('.')
            if (str in map) return str
        }
        
        return null
    }
    
    data.forEach(item => {
        let obj = Object.assign({}, item)
        delete obj.fullName
        let fullName = item.fullName
        let ancestorName = getNearestAncestor(fullName)
        
        map[fullName] = obj
        
        if (ancestorName) {
            let ancestor = map[ancestorName]
            if (! ancestor.children) ancestor.children = []
            ancestor.children.push(obj)
        } else {
            result.push(obj)
        }
    })
    
    return result
}

简单起见使用一级浅拷贝,深拷贝自己实现

【热门文章】
【热门文章】