Lodash 是一个现代 JavaScript 实用工具库,它为开发者提供了大量实用的函数,用于处理数据操作、函数编程和实用功能,这个库在许多项目中被广泛使用,因为它的 API 设计优雅且一致,使得代码更加简洁和易于维护。
Lodash 的核心功能
Lodash 提供了超过 100 个实用函数,这些函数可以大致分为以下几类:
1、函数编程(Functional Programming):
_.map
: 对数组中的每个元素执行一个函数,并返回一个新数组。
_.filter
: 创建一个新数组,包含所有通过指定测试的元素。
_.reduce
: 对数组中的每个元素执行一个累加器函数,将其结果汇总为单个值。
2、实用工具(Utilities):
_.clone
: 创建对象的浅拷贝或深拷贝。
_.isEqual
: 比较两个值是否相等。
_.isEmpty
: 判断值是否是空对象、空数组、空字符串等。
3、函数编程辅助(Function Programming Helpers):
_.curry
: 柯里化函数,允许你部分应用参数。
_.partial
: 部分应用函数的参数。
_.memoize
: 缓存函数的结果,以便后续相同的输入直接返回缓存的结果。
4、函数(Functions):
_.debounce
: 创建一个防抖函数,只有在停止触发事件一段时间后才会执行一次。
_.throttle
: 创建一个节流函数,规定在一个单位时间内,只能触发一次函数执行。
_.once
: 确保一个函数只执行一次。
5、数据操作(Data Manipulation):
_.find
: 从数组中查找满足条件的第一个元素。
_.sortBy
: 根据提供的迭代器函数对数组进行排序。
_.groupBy
: 根据迭代器函数对元素进行分组。
6、集合(Collections):
_.uniq
: 返回没有重复元素的新数组。
_.union
: 合并多个数组,并去除重复元素。
_.intersection
: 计算多个数组的交集。
7、对象(Objects):
_.keys
: 获取对象自身的可枚举属性名。
_.values
: 获取对象自身的所有可枚举属性值。
_.pick
: 从对象中挑选出指定的属性。
8、程序控制流(Program Flow):
_.times
: 创建一个函数,该函数在每次调用时执行 n 次指定的函数。
_.retry
: 创建一个函数,该函数在失败时会重试多次。
_.defer
: 延迟执行一个函数,直到当前调用栈清空。
9、错误处理(Error Handling):
_.attempt
: 尝试执行一个函数并捕获任何错误。
_.pluck
: 从对象数组中提取指定属性的值。
_.where
: 根据多个属性过滤对象数组。
10、类型检测(Type Checking):
_.isArray
: 检查值是否为数组。
_.isBoolean
: 检查值是否为布尔值。
_.isDate
: 检查值是否为日期对象。
Lodash 的安装和使用
要在项目中使用 Lodash,可以通过以下几种方式进行安装:
使用 npm 安装
npm install lodash
然后在代码中引入:
const _ = require('lodash');
使用 CDN 引入
如果你不想安装依赖,可以直接通过 CDN 引入 Lodash:
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>
Lodash 的常见用法示例
以下是一些 Lodash 的常见用法示例:
使用_.map
遍历数组
const numbers = [1, 2, 3, 4]; const doubled = _.map(numbers, function(num) { return num * 2; }); console.log(doubled); // [2, 4, 6, 8]
使用_.filter
过滤数组
const users = [ { 'user': 'barney', 'age': 36, 'active': true }, { 'user': 'fred', 'age': 40, 'active': false } ]; const activeUsers = _.filter(users, function(user) { return user.active; }); console.log(activeUsers); // [{ 'user': 'barney', 'age': 36, 'active': true }]
使用_.reduce
求和
const array = [1, 2, 3, 4]; const sum = _.reduce(array, function(sum, num) { return sum + num; }, 0); console.log(sum); // 10
使用_.clone
深度拷贝对象
const object = { 'a': 1, 'b': { 'c': 2 } }; const other = _.cloneDeep(object); other.b.c = 3; console.log(object); // { 'a': 1, 'b': { 'c': 2 } } console.log(other); // { 'a': 1, 'b': { 'c': 3 } }
使用_.isEqual
比较对象是否相等
const obj1 = { a: 1, b: { c: 2 } }; const obj2 = { a: 1, b: { c: 2 } }; console.log(_.isEqual(obj1, obj2)); // true
使用_.isEmpty
判断对象是否为空
console.log(_.isEmpty({ 'a': 1 })); // false console.log(_.isEmpty({})); // true console.log(_.isEmpty([])); // true
使用_.curry
柯里化函数
const add = (a, b) => a + b; const curriedAdd = _.curry(add); console.log(curriedAdd(1)(2)); // 3 console.log(curriedAdd(1, 2)); // 3
使用_.partial
部分应用函数参数
const greet = function(greeting, name) { return greeting + ' ' + name; }; const sayHelloTo = _.partial(greet, 'hello'); console.log(sayHelloTo('Alice')); // "hello Alice"
使用_.memoize
缓存函数结果
function fibonacci(n) { if (n < 2) return n; return fibonacci(n 1) + fibonacci(n 2); } const memoizedFibonacci = _.memoize(fibonacci); console.log(memoizedFibonacci(10)); // 55 (计算后缓存结果) console.log(memoizedFibonacci(10)); // 55 (直接返回缓存结果)
使用_.debounce
防抖函数
function save() { console.log('Saved!'); } const debouncedSave = _.debounce(save, 1000); debouncedSave(); // Saved! (1秒后执行) debouncedSave(); // Saved! (不会立即执行,因为前一次还在等待中)
使用_.throttle
节流函数
function fetch() { console.log('Fetched!'); } const throttledFetch = _.throttle(fetch, 1000); throttledFetch(); // Fetched! (1秒内最多执行一次) throttledFetch(); // (不会立即执行,因为前一次还在等待中)
使用_.once
确保函数只执行一次
let called = false; const onceFunction = _.once(function() { called = true; console.log('Once function called'); }); onceFunction(); // "Once function called" (第一次调用) called; // true (状态改变) onceFunction(); // (不会再次调用)
使用_.find
查找满足条件的第一个元素
const users = [ { 'user': 'barney', 'age': 36, 'active': true }, { 'user': 'fred', 'age': 40, 'active': false } ]; const user = _.find(users, function(user) { return user.age < 40; }); console.log(user); // { 'user': 'barney', 'age': 36, 'active': true }
使用_.sortBy
根据属性排序数组
const users = [ { 'user': 'fred', 'age': 40 }, { 'user': 'barney', 'age': 36 }, { 'user': 'freddy', 'age': 42 } ]; const byAge = _.sortBy(users, ['age']); console.log(byAge); // [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }, { 'user': 'freddy', 'age': 42 } ]
使用_.groupBy
根据属性分组元素
const users = [ { 'user': 'barney', 'age': 36, 'active': true }, { 'user': 'fred', 'age': 40, 'active': false }, { 'user': 'pebbles', 'age': 40, 'active': true } ]; const byAge = _.groupBy(users, 'age'); console.log(byAge); // { '36': [{ 'user': 'barney', 'age': 36, 'active': true }], '40': [{ 'user': 'fred', 'age': 40, 'active': false }, { 'user': 'pebbles', 'age': 40, 'active': true }] }
使用_.pick
从对象中挑选属性
const object = { 'a': 1, 'b': 'two', 'c': 3 }; const picked = _.pick(object, ['a', 'b']); console.log(picked); // { 'a': 1, 'b': 'two' }
使用_.omit
从对象中删除属性
const object = { 'a': 1, 'b': 'two', 'c': 3 }; const omitted = _.omit(object, ['a', 'c']); console.log(omitted); // { 'b': 'two' }
使用_.defaults
补充对象默认值
const defaults = { 'a': 1, 'b': 'two' }; const object = { 'a': null, 'c': 3 }; const result = _.defaults(object, defaults); console.log(result); // { 'a': null, 'b': 'two', 'c': 3 } (null不会被覆盖)
使用_.assign
合并多个对象
const object = { 'a': { 'b': { 'c': 3 } } }; const source = { 'a': { 'b': { 'd': 4 } }, 'e': {'f':5} }; const assigned = _.assign(object, source); console.log(assigned); // { 'a': { 'b': { 'c': 3, 'd': 4 } }, 'e': { 'f': 5 } } (嵌套对象会被合并)
使用_.extend
合并多个对象(浅拷贝)
const object = { 'a': { 'b': { 'c': 3 } } }; const source = { 'a': { 'b': { 'd': 4 } }, 'e': {'f':5} }; const extended = _.extend({}, object, source); // {}作为第一个参数避免修改原对象 console.log(extended); // { 'a': { 'b': { 'd': 4 } }, 'e': { 'f': 5 } } (浅拷贝,嵌套对象引用不变)
使用_.merge
深度合并多个对象(深拷贝)
const object = { 'a': { 'b': { 'c': 3 } } }; const source = { 'a': { 'b': { 'd': 4 } }, 'e': {'f':5} }; const merged = _.merge({}, object, source); // {}作为第一个参数避免修改原对象 console.log(merged); // { 'a': { 'b': { 'c': 3, d:4 } }, e:{ f:5 } } (深拷贝,嵌套对象完全合并)
使用_.union
合并去重后的数组元素
const a = [1, 2, [3]]; b = [2, [3]]; c = [1, [3]]; // [1, [3]]是重复的,但不同位置不算重复,所以输出是[1, [3], 2];如果需要严格去重,可以使用_.uniqWith(a, b, c, isEqual)来比较内容是否相同,注意这里的比较是基于内容的,而不是基于引用的,[[1], [1]]会被认为不同,因为虽然它们的内容相同,但它们是不同的数组实例,如果需要基于内容的严格去重,可以使用自定义比较函数,const customComparer = (value, other) => JSON.stringify(value) === JSON.stringify(other); const uniqueArray = Array.from(new Set(originalArray.map(item => JSON.stringify(item)))).map(item => JSON.parse(item));这样可以得到基于内容的严格去重数组。
各位小伙伴们,我刚刚为大家分享了有关“lodash”的知识,希望对你们有所帮助。如果您还有其他相关问题需要解决,欢迎随时提出哦!
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1364144.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复