Lodash源码阅读-pull

Lodash 源码阅读-pull

概述

pull 函数是 Lodash 中用于数组操作的实用工具,它通过原地移除数组中指定的值并返回修改后的数组。内部实现通过 baseRest 包装 pullAll 函数,使其能接收多个独立参数而非数组,提供了更灵活的调用方式。

前置学习

依赖函数

  • baseRest:内部工具函数,模拟 ES6 剩余参数功能,处理不定数量参数
  • pullAll:核心实现函数,接收一个数组作为要移除的值列表
  • basePullAll:最底层实现函数,执行实际的数组元素移除操作

技术知识

  • 数组原地修改:直接修改原数组而非创建新数组
  • 函数柯里化:将接受多个参数的函数转变为接受单一参数的函数序列
  • 参数处理:处理函数不定长参数
  • SameValueZero:ECMAScript 规范中的相等比较算法
  • 函数组合:复用已有函数创建新功能

源码实现

js 复制代码
var pull = baseRest(pullAll);

实现思路

pull 函数设计简洁而精妙,通过以下方式实现:

  1. 使用 baseRest 函数包装 pullAll,实现参数格式转换
  2. 当调用 pull(array, a, b, c) 时,baseRest 将参数 a, b, c 收集为数组
  3. 这个数组作为第二个参数传给 pullAll 函数
  4. pullAll 再调用 basePullAll 执行实际的数组元素移除操作
  5. 整个过程直接修改原数组并返回修改后的数组

这种设计将核心逻辑委托给专用函数,同时提供灵活的参数接口,体现了良好的函数组合和复用思想。

源码解析

函数签名:

js 复制代码
function pull(array, ...values)
  • array: 要修改的数组
  • ...values: 要移除的值(可变参数)

实现原理:

js 复制代码
var pull = baseRest(pullAll);

这个简洁的一行代码实际上包含了丰富的细节:

  1. 函数转换baseRest 创建一个新函数,该函数可以收集除第一个参数外的所有参数为数组

    js 复制代码
    // 当调用 pull(array, 1, 2, 3) 时
    // baseRest 将其转换为等效的
    pullAll(array, [1, 2, 3]);
  2. 参数处理机制baseRest 内部工作流程

    • 将参数分割为固定参数和剩余参数
    • 应用函数将剩余参数转为数组
    • 使用 apply 方法调用原函数
  3. 复用现有函数 :完全复用 pullAll 的逻辑,避免代码重复

  4. 函数特性保留baseRest 还通过 setToString 保留了原函数的字符串表示,便于调试

应用场景

  1. 移除特定值
js 复制代码
// 从数组中移除特定值
const array = [1, 2, 3, 1, 2, 3];
pull(array, 2, 3);
console.log(array); // [1, 1]
  1. 数据清理
js 复制代码
// 清理数组中的无效值
const data = ["valid", null, "valid", undefined, "valid", ""];
pull(data, null, undefined, "");
console.log(data); // ['valid', 'valid', 'valid']
  1. 数组过滤
js 复制代码
// 从数组中过滤掉多个值
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
pull(numbers, 2, 4, 6, 8);
console.log(numbers); // [1, 3, 5, 7, 9]
  1. 批量删除
js 复制代码
// 批量删除数组中的元素
const items = ["apple", "banana", "orange", "apple", "pear"];
const toRemove = ["apple", "pear"];
pull(items, ...toRemove);
console.log(items); // ['banana', 'orange']

总结

pull 函数体现了 Lodash 的设计哲学和几个重要的编程思想:

  1. 接口设计:提供简洁直观的 API,同时保持内部实现的复杂性

  2. 函数组合 :通过组合 baseRestpullAll 创建新功能,符合函数式编程原则

  3. 代码复用:避免重复实现类似功能,复用已有函数

  4. 原地修改:直接修改原数组而非创建新数组,适用于特定性能优化场景

  5. 参数灵活性:支持多种参数传递方式,提升使用便利性

  6. 关注点分离:将参数处理和核心逻辑分开,各司其职

通过对 pull 函数的学习,我们不仅了解了这个实用工具的工作原理,还能体会到 Lodash 库中优秀的设计模式和编程实践。

相关推荐
崔庆才丨静觅6 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60617 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了7 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅7 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅7 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅8 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment8 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅8 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊8 小时前
jwt介绍
前端
爱敲代码的小鱼8 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax