目录
Lodash是什么:
Lodash 是一个一致性、模块化、高性能的 JavaScript 实用工具库。Lodash 通过降低 array、number、objects、string 等等的使用难度从而让 JavaScript 变得更简单。 Lodash 的模块化方法 非常适用于:
- 遍历 array、object 和 string
- 对值进行操作和检测
- 创建符合功能的函数
Lodash的主要功能(用法请看使用示例):
数组操作(Array)
方法名 | 功能描述 |
---|---|
_.chunk | 将数组拆分为指定大小的块 |
_.compact | 移除数组中的所有假值(false, null, 0, "", undefined, NaN) |
_.concat | 连接多个数组/值 |
_.difference | 返回第一个数组中不包含在其他给定数组中的值 |
_.drop | 从数组开头移除指定数量的元素 |
_.dropRight | 从数组末尾移除指定数量的元素 |
_.fill | 使用指定值填充数组的部分或全部元素 |
_.findIndex | 返回满足条件的第一个元素的索引 |
_.flatten | 减少一级数组嵌套深度 |
_.flattenDeep | 递归将多维数组展平为一维数组 |
_.head | 获取数组的第一个元素 |
_.indexOf | 获取值在数组中的索引 |
_.intersection | 返回多个数组的交集元素 |
_.join | 将数组元素连接成字符串 |
_.last | 获取数组的最后一个元素 |
_.pull | 移除数组中所有给定的值 |
_.reverse | 反转数组 |
_.slice | 裁剪数组的一部分 |
_.sortedUniq | 对已排序数组进行去重 |
_.tail | 获取除第一个元素外的所有元素 |
_.take | 从数组开头获取指定数量的元素 |
_.union | 返回多个数组的并集(去重) |
_.uniq | 数组去重 |
_.without | 创建排除指定值的新数组 |
_.zip | 将多个数组对应位置的值分组 |
集合操作(Collection)
方法名 | 功能描述 |
---|---|
_.countBy | 根据转换函数的结果统计元素数量 |
_.each | 遍历集合中的每个元素(别名:_.forEach ) |
_.every | 检查集合中所有元素是否满足条件 |
_.filter | 筛选满足条件的元素 |
_.find | 查找满足条件的第一个元素 |
_.groupBy | 根据转换函数的结果对元素分组 |
_.includes | 检查值是否在集合中存在 |
_.keyBy | 根据指定键值创建对象 |
_.map | 对集合中每个元素执行转换函数 |
_.orderBy | 按指定属性和排序方向对集合排序 |
_.partition | 将集合分为满足条件和不满足条件两组 |
_.reduce | 将集合缩减为单个值 |
_.sample | 随机获取集合中的一个元素 |
_.shuffle | 打乱集合的顺序 |
_.size | 获取集合的长度 |
_.some | 检查集合中是否有元素满足条件 |
_.sortBy | 按指定属性升序排序 |
函数操作(Function)
方法名 | 功能描述 |
---|---|
_.after | 创建调用指定次数后才执行的函数 |
_.bind | 绑定函数的this指向 |
_.curry | 创建柯里化函数 |
_.debounce | 创建防抖函数(延迟执行) |
_.delay | 延迟调用函数 |
_.flip | 翻转函数参数的顺序 |
_.memoize | 创建带缓存的函数 |
_.once | 创建只能执行一次的函数 |
_.partial | 部分应用函数参数 |
_.throttle | 创建节流函数(限制执行频率) |
_.unary | 创建只接受一个参数的函数 |
对象操作(Object)
方法名 | 功能描述 |
---|---|
_.assign | 复制源对象的可枚举属性到目标对象(别名:_.extend ) |
_.at | 根据路径获取对象的值 |
_.clone | 浅拷贝对象 |
_.cloneDeep | 深拷贝对象 |
_.defaults | 为对象设置默认值 |
_.findKey | 查找满足条件的第一个属性键 |
_.forIn | 遍历对象自身的和继承的可枚举属性 |
_.forOwn | 遍历对象自身的可枚举属性 |
_.get | 根据路径安全获取对象的值 |
_.has | 检查对象是否有指定路径的属性 |
_.invert | 反转对象的键值对 |
_.keys | 获取对象自身的可枚举属性名 |
_.mapKeys | 通过函数映射对象的键名 |
_.mapValues | 通过函数映射对象的值 |
_.merge | 递归合并多个对象 |
_.omit | 排除对象中指定的属性 |
_.pick | 选择对象中指定的属性 |
_.set | 根据路径设置对象的值 |
_.toPairs | 将对象转换为键值对数组(别名:_.entries ) |
_.values | 获取对象自身的可枚举属性值 |
实用工具(Util)
方法名 | 功能描述 |
---|---|
_.times | 调用函数指定次数并返回结果 |
_.random | 生成指定范围内的随机数 |
_.range | 生成数字范围数组 |
_.escape | 转义字符串中的HTML特殊字符 |
_.noop | 空函数(返回undefined) |
_.uniqueId | 生成全局唯一ID |
_.camelCase | 将字符串转换为驼峰式 |
_.capitalize | 将字符串首字母大写 |
_.isEqual | 执行深度比较判断值是否相等 |
_.isFunction | 检查值是否为函数 |
_.isObject | 检查值是否为对象 |
_.isArray | 检查值是否为数组 |
_.isEmpty | 检查值是否为空(对象/集合/映射) |
_.isString | 检查值是否为字符串 |
_.isNumber | 检查值是否为数字 |
_.isDate | 检查值是否为Date对象 |
_.isError | 检查值是否为Error对象 |
_.isNaN | 检查值是否为NaN |
_.isNil | 检查值是否为null或undefined |
_.isPlainObject | 检查值是否为普通对象(通过{}或new Object创建) |
字符串操作(String)
方法名 | 功能描述 |
---|---|
_.deburr | 去除字符串中的变音符号 |
_.endsWith | 检查字符串是否以指定子串结尾 |
_.kebabCase | 将字符串转换为短横线分隔式 |
_.lowerCase | 将字符串转换为空格分隔的小写单词 |
_.pad | 在字符串两侧填充字符到指定长度 |
_.repeat | 重复字符串指定次数 |
_.replace | 替换字符串中匹配的子串 |
_.snakeCase | 将字符串转换为下划线分隔式 |
_.startCase | 将字符串转换为每个单词首字母大写 |
_.startsWith | 检查字符串是否以指定子串开头 |
_.template | 创建模板字符串 |
_.toLower | 将字符串转换为小写 |
_.toUpper | 将字符串转换为大写 |
_.trim | 去除字符串两端的空白字符 |
_.truncate | 截断字符串并添加省略号 |
_.unescape | 反转义HTML特殊字符 |
_.words | 将字符串拆分为单词数组 |
数学计算(Math)
方法名 | 功能描述 |
---|---|
_.add | 两数相加 |
_.ceil | 向上取整 |
_.floor | 向下取整 |
_.max | 获取数组中的最大值 |
_.mean | 计算数组的平均值 |
_.min | 获取数组中的最小值 |
_.round | 四舍五入取整 |
_.sum | 计算数组值的总和 |
序列操作(Seq)
方法名 | 功能描述 |
---|---|
_.chain | 创建链式操作序列 |
_.tap | 在链式操作中拦截值 |
_.thru | 在链式操作中修改值 |
_.prototype.value | 执行链式操作并返回结果 |
Lodash的安装与使用:
npm安装:
$ npm i --save lodash
项目中引入(二选一):
const _ = require('lodash');
import _ from 'lodash';
使用示例:
数组操作(Array)
// 分块
_.chunk(['a', 'b', 'c', 'd'], 2); // => [['a','b'], ['c','d']]
// 去假值
_.compact([0, 1, false, 2, '', 3]); // => [1, 2, 3]
// 深度扁平化
_.flattenDeep([1, [2, [3, [4]], 5]); // => [1, 2, 3, 4, 5]
// 差集
_.difference([2, 1], [2, 3]); // => [1]
// 去重
_.uniq([2, 1, 2]); // => [2, 1]
// 交集
_.intersection([2, 1], [2, 3]); // => [2]
集合操作(Collection)
const users = [
{ 'user': 'barney', 'age': 36 },
{ 'user': 'fred', 'age': 40 }
];
// 分组
_.groupBy(users, 'age'); // => { '36': [barney对象], '40': [fred对象] }
// 键值映射
_.keyBy(users, 'user'); // => { 'barney': barney对象, 'fred': fred对象 }
// 条件统计
_.countBy(users, user => user.age > 36); // => { 'false': 1, 'true': 1 }
// 多条件排序
_.orderBy(users, ['user', 'age'], ['asc', 'desc']);
// 随机取样
_.sample([1, 2, 3, 4]); // => 随机一个元素
函数操作(Function)
// 防抖(停止操作500ms后执行)
const debounced = _.debounce(() => console.log('Resized!'), 500);
window.addEventListener('resize', debounced);
// 节流(每100ms最多执行一次)
const throttled = _.throttle(() => console.log('Scrolling!'), 100);
window.addEventListener('scroll', throttled);
// 单次执行
const init = _.once(() => console.log('Initialized!'));
init(); // => 'Initialized!'
init(); // 无效果
// 柯里化
const add = (a, b) => a + b;
const curried = _.curry(add);
curried(1)(2); // => 3
对象操作(Object)
const obj = { 'a': 1, 'b': 2 };
const nested = { 'a': { 'b': { 'c': 3 } } };
// 安全取值
_.get(nested, 'a.b.c'); // => 3
_.get(nested, 'a.b.d', 'default'); // => 'default'
// 排除属性
_.omit(obj, ['a']); // => { 'b': 2 }
// 选择属性
_.pick(obj, ['b']); // => { 'b': 2 }
// 深度合并
_.merge({ 'a': 1 }, { 'b': 2 }); // => { 'a': 1, 'b': 2 }
// 深度克隆
const cloned = _.cloneDeep(nested);
实用工具(Util)
// 类型检查
_.isArray([1, 2, 3]); // => true
_.isObject({}); // => true
_.isEmpty(null); // => true
// 范围生成
_.range(4); // => [0, 1, 2, 3]
// 唯一ID
_.uniqueId('contact_'); // => 'contact_1'
// 深度比较
_.isEqual({ 'a': 1 }, { 'a': 1 }); // => true
// 执行多次
_.times(3, () => console.log('Hello')); // 打印3次Hello
字符串操作(String)
// 驼峰转换
_.camelCase('Foo Bar'); // => 'fooBar'
// 短横线命名
_.kebabCase('fooBar'); // => 'foo-bar'
// 截断文本
_.truncate('hi-diddly-ho there', { 'length': 14 }); // => 'hi-diddly-ho...'
// 填充字符
_.pad('abc', 8, '_-'); // => '_-abc_-_'
// 首字母大写
_.capitalize('FRED'); // => 'Fred'
数学计算(Math)
// 数组求和
_.sum([4, 2, 8, 6]); // => 20
// 最大值
_.max([4, 2, 8, 6]); // => 8
// 平均值
_.mean([4, 2, 8, 6]); // => 5
// 向上取整
_.ceil(4.006); // => 5
// 随机数
_.random(5, 10); // => 5到10之间的整数
序列操作(Seq)
// 链式调用
const result = _.chain([1, 2, 3])
.map(n => n * 2)
.filter(n => n > 2)
.value(); // => [4,6]
// 链式中间操作
_.chain([1, 2, 3])
.tap(array => array.pop())
.value(); // => [1,2]
日期处理
// 日期比较(需安装lodash-date)
_.date.compare(new Date(2023, 0, 1), new Date(2023, 0, 2), 'day'); // => -1
总结:
虽然现代JavaScript引入了许多新特性,但Lodash仍然具有不可替代的优势:
稳定性与可靠性:超过10年的开发迭代,处理了各种边界情况
性能优化:针对大型数据集的操作进行了深度优化
丰富功能:提供精心设计的实用函数
一致性API:所有函数保持一致的参数结构和命名规范
无论是处理复杂的数据转换、优化应用性能,还是简化日常开发任务,Lodash都能提供优雅而高效的解决方案。