js递归生成树

1,478 阅读1分钟
  1. 有一个扁平的数组描述了一系列的地理信息,类似于: var locationList = [ { id: 0, name: "中国" }, { id: 1, pid: 0, name: "广东省" }, { id: 2, pid: 1, name: "深圳市" }, { id: 3, pid: 1, name: "广州市" }, ... ] 其中每个节点的 pid 指向了它所属上级地区。现在要求你把这个数组转换成树状结构: var locationTree = buildLocationTree(locationList); console.log(locationTree); 其中 locationTree 的结构应该如下: interface LocationTree { root: LocationNode; } interface LocationNode { id: number; pid?: number; // 问号表示可选属性 name: string; subLocations?: LocationNode[]; } 请实现 buildLocationTree(),输出的父节点里面包含子节点的数组

var locationList = [ {id: 0, name: "中国"}, {id: 1, pid: 0, name: "广东省"}, {id: 2, pid: 1, name: "深证市"}, {id: 3, pid: 1, name: "广州市"}, {id: 4, pid: 2, name: "罗湖区"}, {id: 5, pid: 2, name: "南山区"}, {id: 6, pid: 2, name: "广东省"}, {id: 7, pid: 2, name: "宝安区"}, {id: 8, pid: 3, name: "白云区"}, {id: 9, pid: 3, name: "黄浦区"}, {id: 10, pid: 0, name: "陕西省"}, {id: 11, pid: 10, name: "西安市"}, {id: 12, pid: 10, name: "咸阳市"}, {id: 13, pid: 11, name: "未央区"}, {id: 14, pid: 11, name: "莲湖区"}, {id: 15, pid: 11, name: "新城区"}, {id: 16, pid: 12, name: "渭城区"}, {id: 17, pid: 12, name: "秦都区"}];

function buildLocationTree(list, parentId = 0, childen = [], rootNode = {}) { var treeNode = findNode(list, parentId); if (treeNode.length == 0) { return rootNode; } else if (JSON.stringify(rootNode) == "{}") { var rootNode = {id: 0, name: "中国", subLocation: []}; return buildLocationTree(list, parentId, rootNode.subLocation, rootNode); } else { treeNode.forEach(function (item) { childen.push(item); buildLocationTree(list, item.id, item.subLocation, rootNode); }); return rootNode; } }

function findNode(list, parentId) { var treeNode = []; list.forEach(function (item) { if (item.pid == parentId) { item["subLocation"] = []; treeNode.push(item) } }); return treeNode; } var list = buildLocationTree(locationList); console.log(list);