var arr = [
{ id: 1, parentId: 0, name: '四川' },
{ id: 2, parentId: 0, name: '贵州' },
{ id: 3, parentId: 0, name: '云南' },
{ id: 4, parentId: 0, name: '江苏' },
{ id: 5, parentId: 1, name: '成都' },
{ id: 6, parentId: 2, name: '贵州' },
{ id: 7, parentId: 3, name: '昆明' },
{ id: 8, parentId: 4, name: '苏州' },
{ id: 9, parentId: 5, name: '成都县1' },
{ id: 10, parentId: 5, name: '成都县2' },
{ id: 11, parentId: 5, name: '成都县3' },
{ id: 12, parentId: 5, name: '成都县4' },
{ id: 13, parentId: 5, name: '成都县5' },
{ id: 14, parentId: 6, name: '贵州县1' },
{ id: 15, parentId: 6, name: '贵州县2' },
{ id: 16, parentId: 6, name: '贵州县3' },
{ id: 17, parentId: 7, name: '昆明县1' },
{ id: 18, parentId: 7, name: '昆明县2' },
{ id: 19, parentId: 7, name: '昆明县3' },
{ id: 20, parentId: 8, name: '苏州县1' },
{ id: 21, parentId: 8, name: '苏州县2' },
{ id: 22, parentId: 8, name: '苏州县3' },
{ id: 23, parentId: 8, name: '苏州县4' },
{ id: 24, parentId: 9, name: '成都镇1' },
{ id: 25, parentId: 10, name: '成都镇2' },
{ id: 26, parentId: 24, name: '成都村11' },
{ id: 27, parentId: 24, name: '成都村12' },
{ id: 28, parentId: 24, name: '成都村13' }
]
function main(arr, pid = 0, level = 0) {
var temp = [];
for (var item of arr) {
if (item.parentId === pid) {
// item.level = level + 1;
item.children = main(arr, item.id, item.level);
temp.push(item);
}
}
return temp;
}
var res = main(arr, pid = 0);
console.log(JSON.stringify(res))
// for (var item of res) {
// var result = findId(item, 28)
// console.log('res', result)
// }
function findId(item, id) {
var isFind = false;
if (Array.isArray(item)) {
for (var tree of item) {
if (tree.id == id) {
isFind = true;
var result = Object.assign({}, tree);
delete result.children;
return result;
} else {
if (tree.children.length > 0) {
return findId(tree.children, id);
}
}
}
if (!isFind) return 'not exists';
} else {
if (item.id == id) {
var result = Object.assign({}, item);
delete result.children;
return result;
} else {
return findId(item.children, id);
}
}
}
var data = findParentInTree(res, '28', '3', 'id', 'parentId')
console.log('data', data)
function findParentInTree(trees, id, zIndex, indexId, parentId) {
var ids = [];
var pids = [];
function findId(trees, id) {
trees.map(tree => {
if (tree[indexId] == id) {
var result = Object.assign({}, tree);
delete result.children;
ids.push(result)
return result;
} else {
if (tree.children.length > 0) {
return findId(tree.children, id);
}
}
})
}
function findPid(trees, idInfo) {
var pid = idInfo[parentId];
trees.map(tree => {
if (tree[indexId] == pid) {
var result = Object.assign({}, tree);
delete result.children;
pids.push(result)
return result;
} else {
if (tree.children.length > 0) {
return findPid(tree.children, idInfo);
}
}
})
}
findId(res, id);
if (ids.length !== 1) {
return {};
}
if (zIndex == 0) {
return ids[0];
} else if (zIndex < 0) {
return {};
} else {
for (var k = 1; k <= zIndex; k++) {
var Info = Object.assign({}, k == 1 ? ids[0] : pids[0]);
ids = [];
pids = [];
findPid(trees, Info);
}
if (pids.length !== 1) {
return {};
}
return pids[0]
}
}
结果
[{
"id": 1,
"parentId": 0,
"name": "四川",
"children": [{
"id": 5,
"parentId": 1,
"name": "成都",
"children": [{
"id": 9,
"parentId": 5,
"name": "成都县1",
"children": [{
"id": 24,
"parentId": 9,
"name": "成都镇1",
"children": [{
"id": 26,
"parentId": 24,
"name": "成都村11",
"children": []
}, {
"id": 27,
"parentId": 24,
"name": "成都村12",
"children": []
}, {
"id": 28,
"parentId": 24,
"name": "成都村13",
"children": []
}]
}]
}, {
"id": 10,
"parentId": 5,
"name": "成都县2",
"children": [{
"id": 25,
"parentId": 10,
"name": "成都镇2",
"children": []
}]
}, {
"id": 11,
"parentId": 5,
"name": "成都县3",
"children": []
}, {
"id": 12,
"parentId": 5,
"name": "成都县4",
"children": []
}, {
"id": 13,
"parentId": 5,
"name": "成都县5",
"children": []
}]
}]
}, {
"id": 2,
"parentId": 0,
"name": "贵州",
"children": [{
"id": 6,
"parentId": 2,
"name": "贵州",
"children": [{
"id": 14,
"parentId": 6,
"name": "贵州县1",
"children": []
}, {
"id": 15,
"parentId": 6,
"name": "贵州县2",
"children": []
}, {
"id": 16,
"parentId": 6,
"name": "贵州县3",
"children": []
}]
}]
}, {
"id": 3,
"parentId": 0,
"name": "云南",
"children": [{
"id": 7,
"parentId": 3,
"name": "昆明",
"children": [{
"id": 17,
"parentId": 7,
"name": "昆明县1",
"children": []
}, {
"id": 18,
"parentId": 7,
"name": "昆明县2",
"children": []
}, {
"id": 19,
"parentId": 7,
"name": "昆明县3",
"children": []
}]
}]
}, {
"id": 4,
"parentId": 0,
"name": "江苏",
"children": [{
"id": 8,
"parentId": 4,
"name": "苏州",
"children": [{
"id": 20,
"parentId": 8,
"name": "苏州县1",
"children": []
}, {
"id": 21,
"parentId": 8,
"name": "苏州县2",
"children": []
}, {
"id": 22,
"parentId": 8,
"name": "苏州县3",
"children": []
}, {
"id": 23,
"parentId": 8,
"name": "苏州县4",
"children": []
}]
}]
}]
{ id: 5, parentId: 1, name: '成都' }