Lodash常用方法

1. cloneDeep(value)

用途

深度克隆一个对象或数组,确保复制后的对象与原始数据完全脱离引用关系。

使用示例

javascript 复制代码
import cloneDeep from 'lodash/cloneDeep'
​
const obj = { a: 1, b: { c: 2 } }
const copy = cloneDeep(obj)
copy.b.c = 100
console.log(obj.b.c) // 仍为 2,未被修改

原理简析

Lodash 的 cloneDeep 采用递归方式对输入数据进行遍历复制,处理以下类型:

  • 基本类型

  • 嵌套对象/数组

  • Map / Set / Date / RegExp 等特殊对象

内部使用的是深度优先遍历+类型判断,并处理了循环引用的情况(通过一个 WeakMap 记录已遍历对象)。

适用场景

  • Vue、React 中使用状态复制避免数据联动污染

  • Redux reducer 中不可变数据处理

  • 表单或复杂组件状态回滚

替代方法

javascript 复制代码
structuredClone(obj):原生 API(支持较新浏览器)

JSON.parse(JSON.stringify(obj)):仅适用于无循环引用、无函数、无 Date/RegExp 的对象

2. debounce(func, wait, options)

用途

防抖操作:触发事件后延迟执行,若在延迟期间被再次触发,则重置计时器。

使用示例

javascript 复制代码
import debounce from 'lodash/debounce'
​
const search = debounce((value) => {
  console.log('searching:', value)
}, 500)
​
input.addEventListener('input', (e) => search(e.target.value))

原理简析

利用 setTimeout 实现延迟调用,在函数被重复调用时清除前一次的定时器,并重新设置新的定时器。若设置了 leading 选项,则在首次触发时立即执行。

javascript 复制代码
function debounce(fn, delay) {
  let timer
  return function (...args) {
    clearTimeout(timer)
    timer = setTimeout(() => fn.apply(this, args), delay)
  }
}

适用场景

  • 搜索框实时输入

  • 滚动监听中优化频繁触发事件

  • 调用频率高的按钮事件

替代方法

  • 自定义 debounce 函数(适用于简单场景)

  • 使用 requestAnimationFrame 结合节流思路处理 UI 性能


3. uniq(array)

用途

数组去重,返回一个不包含重复值的新数组。

使用示例

javascript 复制代码
import uniq from 'lodash/uniq'
​
const arr = [1, 2, 2, 3, 4, 4]
console.log(uniq(arr)) // [1, 2, 3, 4]

原理简析

内部通过 Set 或索引判断元素是否已出现:

javascript 复制代码
function uniq(arr) {
  return Array.from(new Set(arr))
}

或者用 indexOf 兼容早期浏览器。

适用场景

  • 数据列表清洗(如标签、关键字)

  • 表单输入去重

  • 数据比较与集合处理

替代方法

原生 Set:

javascript 复制代码
[...new Set(arr)]

手写 filter + indexOf 实现:

javascript 复制代码
arr.filter((v, i, self) => self.indexOf(v) === i)

其他常用 Lodash 方法简要说明

方法名 作用说明 示例用途
throttle 函数节流,固定时间执行一次 滚动监听、页面 resize
get 安全获取嵌套属性 get(obj, 'a.b.c', null)
set 安全设置嵌套属性 set(obj, 'a.b.c', 123)
pick 从对象中选择指定字段 pick(user, ['id', 'name'])
omit 从对象中排除某些字段 omit(user, ['password'])
merge 深度合并两个对象 多对象配置合并
isEqual 深度比较两个值是否相等 React props 比较优化
groupBy 将集合按条件分组 数据聚合、表格分组
find 查找集合中符合条件的第一个元素 用户查找、配置匹配
flatten 数组扁平化处理 处理嵌套数组

使用 Lodash 的建议

  1. 按需引入 :避免引入整个 lodash 包(可使用 lodash-es 或 babel 插件优化 tree-shaking)。

  2. 能用原生就用原生 :如 uniqSet

  3. 复杂对象处理优先考虑 Lodash :如 cloneDeepmergeget,可极大提升代码健壮性。

  4. 高频事件务必使用防抖/节流:避免性能问题。


总结

方法 优点 替代方案
cloneDeep 安全、强大,能处理循环引用 structuredClone、手写递归
debounce 控制频繁触发,参数灵活 手写版 debounce
uniq 快速数组去重 Setfilter + indexOf
相关推荐
子兮曰1 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰1 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万1 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝1 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋1 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁1 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄1 天前
JavaScript 隐式全局变量解析
javascript
汉堡大王95271 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大1 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师1 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端