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 库中优秀的设计模式和编程实践。

相关推荐
秋田君几秒前
Vue3+Node.js 实现大文件上传:断点续传、秒传、分片上传完整教程(含源码)
前端
爱隐身的官人几秒前
ctfshow - web - nodejs
前端·nodejs·ctf
zhong liu bin几秒前
Vue框架技术详解——项目驱动概念理解【前端】【Vue】
前端·javascript·vue.js·vscode·vue
W-GEO几秒前
前端安全攻防:XSS, CSRF 等常见威胁的防范与检测指南
前端·安全·xss
2301_803554524 分钟前
实习项目包装--HTTP 协议和 Web API
前端·网络协议·http
lssjzmn5 分钟前
Spring Web 异步响应实战:从 CompletableFuture 到 ResponseBodyEmitter 的全链路优化
java·前端·后端·springboot·异步·接口优化
这里有鱼汤5 分钟前
上班族没时间炒股?不妨试试这个隔夜超短战法(附:Python量化源码)
前端
n123523512 分钟前
Chrome 插件开发入门指南:从基础到实践
前端·chrome
前端 贾公子19 分钟前
ElementUI 中 validateField 对部分表单字段数组进行校验时多次回调问题
前端·javascript·elementui
棒棒的唐19 分钟前
vue2 elementUI 登录页面实现回车提交登录的方法
前端·javascript·elementui