TypeScript如何通过动态深度索引数组访问嵌套数组内的目标对象
实现方案
你可以通过逐层迭代position数组的方式直接定位到目标对象,无需遍历整棵树,也不需要使用eval,同时保证TypeScript类型安全。
代码实现
// 先对齐你的接口定义 export interface Folder { name: string; type?: string; depth?: number; position: number[]; children: Folder[]; } /** * 通过position数组定位目标文件夹对象 * @param rootFolders 根层级的文件夹数组 * @param position 目标对象的position数组 * @returns 匹配到的文件夹对象,不存在则返回undefined */ function getFolderByPosition(rootFolders: Folder[], position: number[]): Folder | undefined { if (!position.length) return undefined; // 用reduce逐层向下查找,仅迭代position的长度次,无需遍历全树 return position.reduce((currentNode, currentIndex, arrayIndex) => { // 第一层取根数组的对应索引 if (arrayIndex === 0) return rootFolders[currentIndex]; // 后续层级取上一层节点的children对应索引 return currentNode?.children?.[currentIndex]; }, undefined as Folder | undefined); }
使用示例
以你给出的Folder4(position为[0,0,1])为例,调用方式如下:
// 等效于 this.folder[0].children[0].children[1] const folder4 = getFolderByPosition(this.folder, [0, 0, 1]); // 可直接修改返回的对象(返回的是原对象的引用) if (folder4) { folder4.name = "重命名后的文件夹"; }
方案优势
- 无安全风险,完全规避
eval带来的代码注入隐患 - 性能最优,时间复杂度仅为
O(n)(n为position数组的长度),不需要遍历整个文件夹树 - 类型安全,TypeScript可正常推导返回值类型,不会出现类型逃逸
- 容错性高,任意层级索引不存在时会直接返回
undefined,不会抛出运行时错误
内容的提问来源于stack exchange,提问作者creativeD
相关产品推荐
相关产品推荐

