查找树状结构父级关系

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: '成都' }

  

  

原文地址:https://www.cnblogs.com/xiaosongJiang/p/10078489.html