var data = { "c": { "base": [0, 60, 15, 40, 20, 0, 10, {}, 100, 15] }, "n": [{ "c": ["_2ohz", "_071t"], "p": [1, null, null, 250, 120], "q": [50, 20, 35, 20] }, { "p": ["_2ohz", 1, null, 250, 120], "q": [50, 20, 35, 20] }, { "p": ["_071t", 1, null, 250, 120], "q": [50, 20, 35, 20] }], "r": [1], "v": "8.02.54" };
var nodeDef = { "index": 0,"depth": 0, "pTag": "parentTag", "cTag": "cTag", "leftMargin": 0, "rightMargin": 0, "xOffset": 0, "yOffset": 0 };
// 根据父节点ID获取当前节点的index
var getChildIndexByChildpTag = function (nodes, p0TagName, p1TagName) {
for (var i = 0; i < nodes.length; i++) {
if (nodes[i].pTag && nodes[i].pTag[0] == p0TagName && nodes[i].pTag[1] == p1TagName) {
return i;
}
}
}
// 根据当前节点的index获取所有子节点的index
var getAllChildrenIndexByParentIndex = function (nodes, index) {
var indexs = [];
for (var i = 0; nodes[index].cTag && i < nodes[index].cTag.length; i++) {
for (var j = 0; j < nodes.length; j++) {
if (nodes[j].pTag[0] == nodes[index].cTag[i]) {
indexs.push(j);
}
}
}
return indexs;
}
// 将数分层,保存对应节点的index
var getSortedLayers = function (nodes) {
var layerMap = new Map();
for (var i = 0; i < nodes.length; i++) {
if (layerMap.has(nodes[i].depth)) {
var tmpStr = layerMap.get(nodes[i].depth) + "," + i;
layerMap.set(nodes[i].depth, tmpStr);
} else {
layerMap.set(nodes[i].depth, i + "");
}
}
var layers = [];
layerMap.forEach(function (value, key) {
layers.push(value.split(","));
});
return layers;
}
// 设置左边距
var getLeftMargin = function (nodes, index) {
var leftMargin = 0;
var node = nodes[index];
var childrenIndexs;
while (node.cTag) {
childrenIndexs = getAllChildrenIndexByParentIndex(nodes, node.index);
leftMargin = leftMargin + 135 * (node.cTag.length - 1);
node = nodes[childrenIndexs[0]];
}
return leftMargin;
}
// 设置右边距
var getRightMargin = function (nodes, index) {
var rightMargin = 0;
var node = nodes[index];
var childrenIndexs;
while (node.cTag) {
childrenIndexs = getAllChildrenIndexByParentIndex(nodes, node.index);
rightMargin = rightMargin + 135 * (node.cTag.length - 1);
node = nodes[childrenIndexs[childrenIndexs.length - 1]];
}
return rightMargin;
}
var setXoffset = function (nodes) {
for (var i = 0; i < nodes.length; i++) {
nodes[i].leftMargin = getLeftMargin(nodes, i);
nodes[i].rightMargin = getRightMargin(nodes, i);
}
var layers = getSortedLayers(nodes);
for (var i = 0; layers && i < layers.length; i++) {
nodes[parseInt(layers[i][0])].xOffset = nodes[parseInt(layers[i][0])].leftMargin;
for (var j = 1; j < layers[i].length; j++) {
nodes[parseInt(layers[i][j])].xOffset = nodes[parseInt(layers[i][j - 1])].xOffset + nodes[parseInt(layers[i][j - 1])].rightMargin + 270;
}
}
}
// 初始化数据
var formatData = function (data) {
data = data.n;
var nodes = [];
for (var i = 0; i < data.length; i++) {
var tmpNode = {};
tmpNode.index = i;
if(data[i].c){
tmpNode.cTag = data[i].c;
}
tmpNode.pTag = [];
tmpNode.pTag.push(data[i].p[0]);
tmpNode.pTag.push(data[i].p[1]);
nodes.push(tmpNode);
}
nodes[0].depth = nodes[0].yOffset = nodes[0].xOffset =0;
for (var i = 0; i < nodes.length; i++) {
if (nodes[i].cTag) {
var indexs = [];
for (var j = 0; j < nodes[i].cTag.length; j++) {
var index = getChildIndexByChildpTag(nodes, nodes[i].cTag[j], nodes[i].pTag[0]);
// 设置depth、yOffset
nodes[index].depth = nodes[i].depth + 1;
nodes[index].yOffset = 180 * nodes[index].depth;
indexs.push(index);
}
for (var m = 0; m < indexs.length; m++) {
// 设置rn
if (indexs.length > 1 && m < indexs.length - 1) {
nodes[indexs[m]].rn = nodes[indexs[m + 1]].pTag[0];
}
// 设置ln
if (indexs.length > 1 && m > 0) {
nodes[indexs[m]].ln = nodes[indexs[m - 1]].pTag[0];
}
}
}
}
return nodes;
}
var getResponse = function (data) {
var nodes = formatData(data);
setXoffset(nodes);
var response = {};
for (var i = 0; i < nodes.length; i++) {
var tmpObject = {};
tmpObject.p = [nodes[i].xOffset, nodes[i].yOffset, 250, 120];
if (nodes[i].ln) {
tmpObject.ln = nodes[i].ln;
}
if (nodes[i].rn) {
tmpObject.rn = nodes[i].rn;
}
response[nodes[i].pTag[0]] = tmpObject;
}
return response;
}
console.log(getResponse(data));
console