findLeaf / forkProp
findLeaf方法沿着指定的键路径递归查找对象,直到找到没有该键的对象为止。forkProp方法则在当前对象中查找指定属性,如果不存在则沿着叶子键路径递归查找。
语法
javascript
findLeaf(obj, leafKey)
forkProp(obj, leafKey, propName)描述
findLeaf 函数会沿着 leafKey 指定的键路径不断深入查找。每次迭代时检查当前对象是否包含该键,如果包含则继续深入到下一层;如果不包含,则说明已经到达叶子节点,返回当前对象。使用迭代方式替代递归,避免深层嵌套导致的栈溢出。
forkProp 函数在查找属性时具有"分叉"特性:优先在当前对象中查找 propName 属性,如果当前对象存在该属性则直接返回;否则沿着 leafKey 路径继续向下查找,直到找到包含目标属性的对象或到达叶子节点。
两个函数的时间复杂度均为 O(k),其中 k 是叶子键的嵌套深度。空间复杂度为 O(1),使用迭代方式仅需常量额外空间。
注意事项
findLeaf的第一个参数必须是对象类型,否则返回null并给出警告findLeaf的第二个参数(leafKey)必须是有效的非空字符串forkProp的三个参数都必须是有效值,第一个为对象,后两个为非空字符串- 两个函数均使用
hasOwnProperty进行键判断,不会遍历原型链上的属性 - 当遍历到非对象类型(如字符串、数字)时,迭代会自然终止
- 警告来源为 dlsjs 库
示例
findLeaf 基本用法
forkProp 基本用法
浏览器兼容
findLeaf 和 forkProp 使用了 hasOwnProperty 等基础 JavaScript API,在所有现代浏览器中均可使用,包括 IE9+。
性能考虑
- 时间复杂度: O(k) - 其中 k 是叶子键的嵌套深度
- 空间复杂度: O(1) - 使用迭代方式,仅需常量额外空间
- 相比递归实现,迭代方式避免了调用栈开销,能够处理更深的嵌套结构而不会栈溢出
- 函数内部做了参数校验,避免无效输入导致异常
相关函数
treeFind- 在树形结构中查找满足条件的第一个节点treeFindParent- 查找树中满足条件节点的父节点treeForEach- 遍历树形结构中的每个节点