Lodash 源码阅读-parent
概述
parent
是 Lodash 内部的一个工具函数,用于获取对象在指定路径的父级值。该函数接收一个对象和一个路径数组作为参数,返回路径所指向位置的父级值。这个函数在实现 Lodash 的一些修改嵌套对象属性的方法(如 _.unset
、_.update
等)中起着关键作用。
前置学习
依赖函数
baseGet
:根据指定的路径从对象中获取值,是_.get
方法的基础实现baseSlice
:数组切片的基础实现,从数组创建一个新的切片,类似原生的Array.prototype.slice
技术知识
- 数组切片:通过
baseSlice
实现路径数组的截取 - 对象属性访问:通过
baseGet
实现嵌套对象的属性访问 - 路径解析:理解如何处理和操作路径数组
源码实现
javascript
function parent(object, path) {
return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
}
实现思路
parent
函数的实现非常简洁明了。它的目标是获取路径所指位置的父级对象。实现思路如下:
- 检查路径长度是否小于 2(即路径只有一个部分或为空)
- 如果路径长度小于 2,则直接返回原始对象(因为父级就是对象自身)
- 否则,使用
baseSlice
从路径数组中获取除最后一个元素外的所有元素(即父路径) - 然后使用
baseGet
根据这个父路径从原始对象中获取父级值
源码解析
条件判断
javascript
return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
这行代码使用了三元运算符进行条件判断:
path.length < 2
判断路径是否包含少于两个元素- 若路径为空数组
[]
,则path.length = 0 < 2
为真,返回object
- 若路径只有一个元素,如
['a']
,则path.length = 1 < 2
为真,返回object
- 这些情况下,父级就是对象自身
- 若路径为空数组
获取父路径
javascript
baseSlice(path, 0, -1);
如果路径长度不小于 2,则使用 baseSlice
获取父路径:
baseSlice
类似于原生的Array.prototype.slice
,但是是 Lodash 内部优化实现- 参数
0
表示从索引 0 开始(即数组的开始) - 参数
-1
表示截止到倒数第一个元素之前(不包括最后一个元素) - 例如,对于路径
['a', 'b', 'c']
,这会得到['a', 'b']
这一步的目的是去掉路径的最后一个元素,因为最后一个元素代表的是我们想要获取其父级的属性。
获取父级值
javascript
baseGet(object, baseSlice(path, 0, -1));
在获取到父路径后,使用 baseGet
从对象中获取对应路径的值:
baseGet
是 Lodash 中实现对象属性访问的核心函数- 它会根据提供的路径,逐层访问对象的嵌套属性
- 例如,对于对象
{ a: { b: { c: 1 } } }
和父路径['a', 'b']
,它会返回{ c: 1 }
总结
parent
函数虽然简短,但在 Lodash 的对象操作方法中扮演着重要角色。它体现了 Lodash 库设计的几个重要原则:
-
功能分解:将复杂操作分解为简单的、可复用的函数
-
代码复用 :通过组合
baseGet
和baseSlice
实现功能,避免重复编写逻辑 -
清晰简洁:使用三元运算符和函数组合,使代码简洁易读
-
边界处理:正确处理路径长度小于 2 的边界情况
该函数主要应用于需要访问和修改嵌套对象的场景,特别是在 Lodash 的 _.unset
、_.update
等方法中,用于确定要操作的确切位置的父级对象。