{
"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
}
简单起见使用一级浅拷贝,深拷贝自己实现