Skip to content

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 基本用法

浏览器兼容

findLeafforkProp 使用了 hasOwnProperty 等基础 JavaScript API,在所有现代浏览器中均可使用,包括 IE9+。

性能考虑

  • 时间复杂度: O(k) - 其中 k 是叶子键的嵌套深度
  • 空间复杂度: O(1) - 使用迭代方式,仅需常量额外空间
  • 相比递归实现,迭代方式避免了调用栈开销,能够处理更深的嵌套结构而不会栈溢出
  • 函数内部做了参数校验,避免无效输入导致异常

相关函数

  • treeFind - 在树形结构中查找满足条件的第一个节点
  • treeFindParent - 查找树中满足条件节点的父节点
  • treeForEach - 遍历树形结构中的每个节点