JavaScript中省市区路径检索的核心是从叶子节点向上回溯构建完整路径,利用Map预处理扁平数组实现O(1)父节点查找,再通过循环逐级获取根到叶子的路径数组,并支持自定义字段与格式化输出。

JavaScript 中对接口返回的省市区树形数据做路径检索,核心是「从叶子节点向上回溯到根节点」,构建完整路径(如:中国 > 广东省 > 深圳市 > 南山区)。只要树结构有明确的 id 和 parentId(或 parentCode),就能高效实现。
确认树形数据结构特征
常见省市区接口返回的是扁平数组(非嵌套),例如:
[
{ code: "100000", name: "中国", level: 0, parentCode: null },
{ code: "110000", name: "北京市", level: 1, parentCode: "100000" },
{ code: "110100", name: "市辖区", level: 2, parentCode: "110000" },
{ code: "110101", name: "东城区", level: 3, parentCode: "110100" }
]
关键点:
- 每个节点含唯一标识(如
code)和父级标识(如parentCode) - 根节点的
parentCode通常为null、""或与自身相同 - 不依赖递归遍历整棵树,避免性能浪费
用 Map 预处理加速查找
将扁平数组转为 Map<code>,以 <code>code 为 key,节点为 value,实现 O(1) 查找父节点:
立即学习“Java免费学习笔记(深入)”;
const map = new Map(data.map(item => [item.code, item]));
后续只需按 code → parentCode → parentCode… 逐级向上取值,无需遍历数组。
实现路径回溯函数
给定目标节点 code,返回从根到该节点的路径数组(顺序为:根 → 叶):
function getPathByCode(code, map, idKey = 'code', parentKey = 'parentCode') {
const path = [];
let current = map.get(code);
while (current) {
path.unshift({ code: current[idKey], name: current.name });
if (!current[parentKey] || current[parentKey] === current[idKey] || current[parentKey] === '') {
break;
}
current = map.get(current[parentKey]);
}
return path;
}
// 使用示例
const path = getPathByCode('110101', map);
// → [{code:"100000",name:"中国"}, {code:"110000",name:"北京市"}, {code:"110100",name:"市辖区"}, {code:"110101",name:"东城区"}]
说明:
-
unshift保证路径从根开始排列;也可用push + reverse() - 终止条件覆盖常见根节点标识:
null、空字符串、自引用 - 支持自定义字段名(适配不同接口字段,如
areaCode/provinceId等)
扩展:批量路径查询 & 格式化字符串
若需渲染为「中国 > 北京市 > 市辖区 > 东城区」,可封装格式化方法:
function formatPath(path, separator = ' > ') {
return path.map(node => node.name).join(separator);
}
// 批量查询多个 code 的路径(如地址列表)
const codes = ['110101', '440305', '310115'];
const paths = codes.map(code => formatPath(getPathByCode(code, map)));
注意:首次构建 Map 是必要开销,但后续所有查询都是 O(n) 时间复杂度(n 为路径深度),远优于每次全量遍历。


















