如何根据对象path属性值查找数组中匹配的目标元素
问题场景
定义的变量为 tree,结构如下:
需求是根据元素的path属性查找对应目标节点,已知path值为Documents的节点在子节点数组中的索引为0。
- 已知硬编码索引可以正确拿到结果:
var myFolder = tree.childs[0]
但实际场景下无法提前知道目标节点的索引,仅已知其path属性值,尝试编写如下查找代码:
var myFolder = tree.map(Folder => Folder.path).indexOf('Documents/');
运行时抛出类型错误:implicity has an 'any' type(隐式具有'any'类型)
问题根因
- 调用数组方法的主体错误:
tree是根节点对象,不是子节点数组,子节点列表存储在tree.childs属性上,直接对非数组的tree调用map方法本身逻辑就不成立。 - 逻辑返回值不符合预期:
map + indexOf的组合最终拿到的是索引值,不是目标节点对象本身。 - TS类型报错原因:遍历回调的入参没有声明对应类型,TS无法推导参数结构,才会提示隐式any。
正确实现
直接获取目标节点(推荐)
用数组find方法遍历子节点列表,直接匹配path属性拿到目标对象,TS环境下补充对应类型声明即可解决类型报错:
// TS环境需声明节点类型,纯JS环境可删除类型相关代码 interface FolderNode { path: string; childs?: FolderNode[]; // 其余自定义属性可按需补充 } const myFolder = tree.childs.find((node: FolderNode) => node.path === 'Documents');
如果需要处理节点不存在的边界情况,补充判空逻辑即可:
if (!myFolder) { // 自定义找不到节点时的处理逻辑 throw new Error('目标路径不存在'); }
先获取索引再取节点
如果业务逻辑需要先拿到目标节点的索引,用findIndex替代map+indexOf的写法,遍历一次就能拿到结果,性能更好:
const targetIndex = tree.childs.findIndex((node: FolderNode) => node.path === 'Documents'); const myFolder = targetIndex !== -1 ? tree.childs[targetIndex] : null;
注意:匹配的path值要和节点实际存储的字符串完全一致,你之前写的匹配值是带尾部斜杠的
'Documents/',如果实际节点存储的path不带斜杠会匹配失败,注意核对格式。
内容的提问来源于stack exchange,提问作者peace_love
相关产品推荐
相关产品推荐

