Skip to content

Instantly share code, notes, and snippets.

@giscafer
Last active May 26, 2018 15:41
Show Gist options
  • Save giscafer/737645e577d8ba0643798caf9b4dfaca to your computer and use it in GitHub Desktop.
Save giscafer/737645e577d8ba0643798caf9b4dfaca to your computer and use it in GitHub Desktop.
tree data convert
/**
* 父子关系的原始数据格式化成树形结构数据
* @param {Array<Object>} data 原始数据
* @return {Array<Object>} 树形结构数据
*/
export function dataToTree(data) {
/*tslint:disable*/
let pos = {},
tree = [],
i = 0,
count = 0,
len = data.length;
while (data.length !== 0) {
let item = data[i];
item['code'] = item['_id'] || item['code'];
item['label'] = item['name'] || '未命名';
item['data'] = item['code'];
if (item.parentId == -1 || !item.parentId) {
item.children = [];
tree.push(item);
pos[item.code] = [tree.length - 1];
data.splice(i, 1);
i--;
} else {
let posArr = pos[item.parentId];
if (posArr != undefined) {
let obj = tree[posArr[0]];
for (let j = 1; j < posArr.length; j++) {
obj = obj.children[posArr[j]];
}
item.children = [];
obj.children.push(item);
pos[item.code] = posArr.concat([obj.children.length - 1]);
data.splice(i, 1);
i--;
}
}
i++;
count++;
if (i > data.length - 1) {
i = 0;
}
//避免死循环
if (count > len * 5) {
return tree;
}
}
/*tslint:ensable*/
return tree;
}
@giscafer
Copy link
Author

var source = [
    {id: "0", name: "a"},
    {id: "1", name: "b"},
    {id: "013", name: "abd", parent: "01"},
    {id: "2", name: "c"},
    {id: "3", name: "d"},
    {id: "00", name: "aa", parent: "0"},
    {id: "01", name: "ab", parent: "0"},
    {id: "02", name: "ac", parent: "0"},
    {id: "010", name: "aba", parent: "01"},
    {id: "011", name: "abb", parent: "01"},
    {id: "012", name: "abc", parent: "01"}
];
转换代码如下:

var map = {};
var dest = [];

source.forEach(function(it) {
    map[it.id] = it;
});

source.forEach(function(it) {
    if (!it.parent) {
        //根节点
        dest.push(it);
    }
    else {
        //叶子节点
        map[it.parent].children = map[it.parent].children || [];
        map[it.parent].children.push(it);
    }
});

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment