SOURCE

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 命令行工具 X clear

                    
>
console