Lodash 源码阅读-baseValues
概述
baseValues 是 Lodash 中的一个内部工具函数,作为 _.values 和 _.valuesIn 方法的基础实现。它接收一个对象和一个属性名数组,返回对应属性值组成的新数组。这个函数实现了从对象中提取指定属性值的核心逻辑,是 Lodash 中对象值提取操作的基础构建块。
前置学习
依赖函数
- arrayMap:用于遍历数组并对每个元素应用转换函数,返回转换后的新数组。在
baseValues中用于遍历属性名并获取对应的对象属性值。
技术知识
- 对象属性访问:通过中括号表示法
object[key]访问对象的动态属性 - 数组映射:理解如何将一个数组映射为另一个数组
- 闭包:理解在回调函数中如何访问外部作用域的变量
源码实现
function baseValues(object, props) {
return arrayMap(props, function (key) {
return object[key];
});
}
实现思路
baseValues 函数的实现思路直接明了:
- 接收一个对象
object和一个属性名数组props作为参数 - 使用
arrayMap函数遍历属性名数组 - 对于每个属性名,通过
object[key]获取对应的属性值 - 返回包含所有属性值的新数组
这种实现利用了 arrayMap 函数处理数组迭代,同时通过闭包特性在迭代函数中访问外部的 object 参数。
源码解析
1. 函数定义与参数
function baseValues(object, props) {
函数接收两个参数:
object:要获取属性值的对象props:包含属性名的数组
这个函数没有进行参数校验,假定调用方(如 values 和 valuesIn 函数)已经确保了传入的参数符合预期。这符合 Lodash 内部函数的设计模式,即基础函数专注于核心逻辑,而参数校验和边界情况处理由上层函数负责。
2. 使用 arrayMap 映射属性值
return arrayMap(props, function (key) {
return object[key];
});
这是函数的核心部分:
- 使用
arrayMap函数遍历props数组中的每个属性名 - 对于每个属性名
key,返回object[key](即对象中对应的属性值) arrayMap会返回一个新数组,包含所有映射后的结果(即所有属性值)
在这里,arrayMap 负责处理数组遍历和结果收集的细节,而 baseValues 只需要提供一个简单的转换函数。这种关注点分离的设计使代码更加清晰和可维护。
3. 使用场景与示例
baseValues 在 Lodash 中主要通过 values 和 valuesIn 两个公共 API 函数使用:
// values 函数的实现
function values(object) {
return object == null ? [] : baseValues(object, keys(object));
}
// valuesIn 函数的实现
function valuesIn(object) {
return object == null ? [] : baseValues(object, keysIn(object));
}
示例:
var object = { a: 1, b: 2, c: 3 };
var props = ["a", "c"];
// 等同于 baseValues(object, props) 的结果
// => [1, 3]
// 完整的 values 调用
_.values(object);
// => [1, 2, 3]
这里的区别在于:
values使用keys获取对象自身的可枚举属性名valuesIn使用keysIn获取对象自身及原型链上的可枚举属性名- 两者都将获取的属性名数组传递给
baseValues来提取对应的属性值
总结
baseValues 函数是 Lodash 中一个内部工具函数,它通过组合使用 arrayMap 实现了从对象中提取指定属性值的功能。
- 使用函数组合来分离关注点,提高代码可维护性
- 利用闭包特性在迭代函数中访问外部变量
- 构建通用的底层函数作为多个公共 API 的共享基础
- 在 JavaScript 中使用属性名数组动态访问对象属性的技巧