Lodash源码阅读-baseValues

91 阅读3分钟

Lodash 源码阅读-baseValues

概述

baseValues 是 Lodash 中的一个内部工具函数,作为 _.values_.valuesIn 方法的基础实现。它接收一个对象和一个属性名数组,返回对应属性值组成的新数组。这个函数实现了从对象中提取指定属性值的核心逻辑,是 Lodash 中对象值提取操作的基础构建块。

前置学习

依赖函数

  • arrayMap:用于遍历数组并对每个元素应用转换函数,返回转换后的新数组。在 baseValues 中用于遍历属性名并获取对应的对象属性值。

技术知识

  • 对象属性访问:通过中括号表示法 object[key] 访问对象的动态属性
  • 数组映射:理解如何将一个数组映射为另一个数组
  • 闭包:理解在回调函数中如何访问外部作用域的变量

源码实现

function baseValues(object, props) {
  return arrayMap(props, function (key) {
    return object[key];
  });
}

实现思路

baseValues 函数的实现思路直接明了:

  1. 接收一个对象 object 和一个属性名数组 props 作为参数
  2. 使用 arrayMap 函数遍历属性名数组
  3. 对于每个属性名,通过 object[key] 获取对应的属性值
  4. 返回包含所有属性值的新数组

这种实现利用了 arrayMap 函数处理数组迭代,同时通过闭包特性在迭代函数中访问外部的 object 参数。

源码解析

1. 函数定义与参数

function baseValues(object, props) {

函数接收两个参数:

  • object:要获取属性值的对象
  • props:包含属性名的数组

这个函数没有进行参数校验,假定调用方(如 valuesvaluesIn 函数)已经确保了传入的参数符合预期。这符合 Lodash 内部函数的设计模式,即基础函数专注于核心逻辑,而参数校验和边界情况处理由上层函数负责。

2. 使用 arrayMap 映射属性值

return arrayMap(props, function (key) {
  return object[key];
});

这是函数的核心部分:

  • 使用 arrayMap 函数遍历 props 数组中的每个属性名
  • 对于每个属性名 key,返回 object[key](即对象中对应的属性值)
  • arrayMap 会返回一个新数组,包含所有映射后的结果(即所有属性值)

在这里,arrayMap 负责处理数组遍历和结果收集的细节,而 baseValues 只需要提供一个简单的转换函数。这种关注点分离的设计使代码更加清晰和可维护。

3. 使用场景与示例

baseValues 在 Lodash 中主要通过 valuesvaluesIn 两个公共 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 实现了从对象中提取指定属性值的功能。

  1. 使用函数组合来分离关注点,提高代码可维护性
  2. 利用闭包特性在迭代函数中访问外部变量
  3. 构建通用的底层函数作为多个公共 API 的共享基础
  4. 在 JavaScript 中使用属性名数组动态访问对象属性的技巧