什么是 lodash
- Lodash 是一个一致性、模块化、高性能的 JavaScript 实用工具库。
为什么要用 lodash
- JS 先天提供的功能不够丰富
- Lodash 对 JS 的这种不足提供了补充,它将一些常用的功能进行了封装
- Lodash 通过降低array、number、objects、string 等等的使用难度从而让 JavaScript 变得更简单
- 支持最新的运行环境,兼容性好
特点
- Lodash 的大部分函数都不会再原有的数据上进行操作, 而是复制出一个新的数据而不改变原有数据
使用
安装
- 首先终端执行
npm i -g npm
, 如果报错提示 permission denied, 在命令前加上 sudo, 回车输入密码,再回车等待安装完成即可 - 然后终端执行
npm i --save lodash
,执行成功就安装好了
引用
- 安装完成后就可以在需要的文件中引入: import _ from 'lodash'
使用
- 在需要使用的地方直接_.***(lodash 方法)就好, 比如 _.uniq([1,1,2,2,3])
常用函数
字符串
- camelCase([string='']),转换字符串 string 为驼峰写法
_.camelCase('Foo Bar');// => 'fooBar'
_.camelCase('--foo-bar--');// => 'fooBar'
_.camelCase('__FOO_BAR__');// => 'fooBar'
- capitalize([string='']), 转换字符串 string 首字母为大写,剩下为小写
- endWith([string=''],[target],[position=string.length]),检查字符串 string 是否以给定的 target 字符串结尾
- escape([string='']),转义 string 中的&、<、>、""、""、"`"字符为 HTML实体字符
- escapeRegExp([string='']),转义 RegExp 字符串中特殊的字符 "^", "$", "", ".", "*", "+", "?", "(", ")", "[", "]", ", ", 和 "|"
- unescape([string='']), escape的反向版。 这个方法转换string字符串中的 HTML 实体&, <, >, ", ', 和 ` 为对应的字符。
- lowerCase([string="]),转换字符串 string 以空格分开单词,并转换为小写
- lowerFirst([string='']),转换字符串 string 的首字母为小写
- replace([string=''],pattern,replacement),替换 string 字符串中匹配的 pattern 为给定的 replacement
_.replace('Hi Fred', 'Fred', 'Barney');// 'Hi Barney'
- split([string=''], separator, [limit]), 根绝 separator 拆分字符串 string,limit 为限制结果的数量
_.split('a-b-c', '-', 2);// ['a', 'b']
- startWith([string=''], [target], [position=0]), 检查字符串 string 是否以 target 开头
_.startsWith('abc', 'a');// true
- toLower([string='']), 转换整个 string 字符串的字符为小写
- toUpper([string='']), 转换整个 string 字符串的字符为小写
- trim([string='', [chars=whitespace]),从 string 字符串中移除前面和后面的空格或指定的字符
- trimEnd([string='', [chars=whitespace]),从 string 字符串中移除后面的空格或指定的字符
- trimStart([string='', [chars=whitespace]),从 string 字符串中移除前面的空格或指定的字符
- upperCase([string='']),转换字符串 String 为空格分隔的大写单词
_.upperCase('--foo-bar');// 'FOO BAR'
- upperFirst([string='']),转换字符串 string 的首字母为大写
_.upperFirst('fred'); // 'Fred'
_.upperFirst('FRED'); // 'FRED'
- words([string=''],[pattern]),拆分字符串 string 中的词为数组
数组
- chunk(array, [size=1]), 将数组切分
const arr = [1,2,3,4,5,6,7,8,9];
_chunk(arr,2) // [[1,2],[3,4],[5,6],[7,8],[9]]
- compact(array), 剔除数组中的非假值元素,假值元素包括false、null、0、''、undefined、NaN
_.compact([0, 1, false, 2, '', 3]);
- concat(array, [values]), 将 array与任何数组 或 值连接在一起
var other = _.concat(array, 2, [3], [[4]]); // [1, 2, 3, [4]]
- difference(array,[values]), 将 values 中包含的元素从 array 中剔除
_.difference([3, 2, 1], [4, 2]);// [3, 1]
- drop(array,[n=1]),去除 array 中的前 n 个元素
_.drop([1, 2, 3], 2);
- dropRight(array,[n=1]) 去除 array 尾部的 n 个元素
_.dropRight([1, 2, 3], 2);
- fill(array,value,[start=0],[end=array.length]), 从 start 开始到 end 结束(不包括 end),使用 value 填充
_.fill([4, 6, 8, 10], '*', 1, 3); // [4, '*', '*', 10]
- indexOf(array,value,[fromIndex=0]), 返回首次value在数组 array中被找到的 索引值, 如果fromIndex为负值,将从数组array尾端引进行匹配。
_.indexOf([1, 2, 1, 2], 2, 2); // 3
- join(array, [separator=","]), 将 array 中的所有元素转换为由 separator 分隔的字符串
_.join(['a', 'b', 'c'], '~');// 'a~b~c'
- last(array),获取 array 中的最后一个元素
_.last([1, 2, 3]);// => 3
- pull(array,[values]), 移除数组 array 中所有和给定值相等的元素
var array = [1, 2, 3, 1, 2, 3];
_.pull(array, 2, 3);
console.log(array); // [1,1]
- pullAll(array,values),将 values 中包含的所有值都从 array 中移除
var array = [1, 2, 3, 1, 2, 3];
_.pullAll(array, [2, 3]);
console.log(array);
remov(array, [predicate=_.identity]),移除数组中predicate(断言)返回为真值的所有元素
var array = [1, 2, 3, 4];
var evens = _.remove(array, function(n) {
return n % 2 == 0;
});
console.log(array); // [1, 3]
- reverse(array) ,数组反转
集合
- countBy(collection,[iteratee=_.identity])创建一个组成对象,key(键)是经过iteratee(迭代函数) 执行处理collection中每个元素后返回的结果,每个key(键)对应的值是 iteratee(迭代函数)返回该key(键)的次数(注:迭代次数)
_.countBy(['one', 'two', 'three'], 'length');// { '3': 2, '5': 1 }
- each/forEach(collection, iteratee=_.identity),调用 iteratee 便利 collection 中的每个元素,iteratee 调用三个参数(value,index|key,collection).如果迭代函数 iteratee 显式的返回 false,迭代会提前退出,迭代的顺序是不确定的
_.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
console.log(key); // 'a' 'b'
});
- eachRight/forEachRight(collection, iteratee=_.identity), 从后开始遍历
- every(collection, [predicate=_.identity]),通过 predicate 检查 collection 中的所有元素是否都返回真值,一旦返回假值,迭代马上停止
- filter(collection, predicate=_.identity),遍历 collection 元素,返回 predicate 返回真值的所有元素的数组,predicate调用三个参数(value,index|key,collection)
var users = [
{ 'user': 'barney', 'age': 36, 'active': true },
{ 'user': 'fred', 'age': 40, 'active': false }
];
_.filter(users, function(o) { return !o.active; });// objects for ['fred']
- find(collection, [predicate=_.identity],[fromIndex=0]), 遍历 collection ,返回 predicate 第一个返回真值的元素,predicate 调用三个参数(value,index|key,collection)
var users = [
{ 'user': 'barney', 'age': 36, 'active': true },
{ 'user': 'fred', 'age': 40, 'active': false },
{ 'user': 'pebbles', 'age': 1, 'active': true }
];
_.find(users, function(o) { return o.age < 40; });// object for 'barney'
- findLast(collection,[predicate=_.identity],[fromIndex=collection.length-1]),从尾部开始找
- groupBy(collection, iteratee=_.identity),创建一个对象,key是 iteratee 遍历 collection 中的每个元素返回的结果,分组值的顺序是由他们出现在 collection 中的顺序确定的,没个键对应的值负责生成 key 的元素组成的数组
_.groupBy(['one', 'two', 'three'], 'length');// { '3': ['one', 'two'], '5': ['three'] }
- includes(collection,value,[fromIndex=0]), 从指定的位置开始检查该集合是否包含给定的元素
_.includes([1, 2, 3], 1, 2);// false
- map(collection,[iteratee=_.identity]),将迭代函数 iteratee 返回的结果作为一个数组返回
_.map([4, 8], (value)=>{
return value*value;
}; // [16, 64]
- orderBy(collection,[iteratees=[_.identity]],[orders]),根据 iteratee 结果进行排序, 如果没有指定 orders,默认以升序排序,否者,指定为'desc'降序,或者指定'asc'升序,排序对应值
var users = [
{ 'user': 'fred', 'age': 48 },
{ 'user': 'barney', 'age': 34 },
{ 'user': 'fred', 'age': 40 },
{ 'user': 'barney', 'age': 36 }
];
// 以 `user` 升序排序 再 `age` 以降序排序。
_.orderBy(users, ['user', 'age'], ['asc', 'desc']);// objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
- reduce(collection, [iteratee=_.identity],[accumulator]), 通过 iteratee 遍历 collection 中的每个元素,每次返回的值会作为下一次迭代的第一个参数使用,如果没有提供 accumulator,则 collection 中的第一个元素作为初始值,iteratee 调用 4 个参数(accumlator, value,index|key,collection)
_.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
(result[value] || (result[value] = [])).push(key);
return result;
}, {}); // { '1': ['a', 'c'], '2': ['b'] } (无法保证遍历的顺序)
- sample(collection), 从 collection 中随机获取一个元素
_.sample([1, 2, 3, 4]);// 2
- some(collection,[predicate=_.identity]),通过 predicate 检查 collection中是否存在符合条件的元素,一旦找到,遍历就停止, predicate 调用三个参数(value,index|key,collection)
_.some([null, 0, 'yes', false], Boolean);// true
- sortBy(collection, [iteratees=[_.identity]]),创建一个元素数组,以 iteratee 处理的结果升序排序,这个方法执行稳定排序,
var users = [
{ 'user': 'fred', 'age': 48 },
{ 'user': 'barney', 'age': 36 },
{ 'user': 'fred', 'age': 40 },
{ 'user': 'barney', 'age': 34 }
];
_.sortBy(users, function(o) { return o.user; });// objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
_.sortBy(users, ['user', 'age']);// objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]
_.sortBy(users, 'user', function(o) {
return Math.floor(o.age / 10);
});// objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
对象
- findKey(object,[predicate=_.identity]), 返回最先被 predicate 判断为真值的元素 key,而不是元素本身
var users = {
'barney': { 'age': 36, 'active': true },
'fred': { 'age': 40, 'active': false },
'pebbles': { 'age': 1, 'active': true }
};
_.findKey(users, function(o) { return o.age < 40; });// 'barney' (iteration order is not guaranteed)
- has(object, path), 检查 path 是否是 object 对象的直接属性
- hasIn(obj,path),检查 path 是否是 obj 对象的直接或继承属性
- nvoke(obj,path,[args]),调用 obj 对象 path 上的方法
var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };
_.invoke(object, 'a[0].b.c.slice', 1, 3);// [2, 3]
函数
- after(n,func), 当他被调用 n 或更多次后将马上触发 func
var saves = ['profile', 'settings'];
var done = _.after(saves.length, function() {
console.log('done saving!');
});
_.forEach(saves, function(type) {
asyncSave({ 'type': type, 'complete': done });
});// => Logs 'done saving!' after the two async saves have completed.
- debounce(func,[wait=0], [options=]),防抖函数,该函数会从上一次被调用后,延迟 wait 毫秒后调用 func 方法, options.leading 与 options.trailing 决定延迟前后如何触发,是先调用后等待,还是先等待后调用
- defer(func, [args]), 推迟调用 func,知道当前堆栈清理完毕,调用是,任何附件的参数都会传给 func
- delay(func, wait, [args]), 延迟 wait 毫秒后调用 func,调用时,任何附加的参数会传给func
- once(func),创建只能调用一次的函数,重复调用返回第一次调用结果,func 调用时,this 绑定到创建的函数,并传入对应参数
var initialize = _.once(createApplication);
initialize();
initialize();// `initialize` 只能调用 `createApplication` 一次。
判断
- eq(value,other), 判断两个值是否相等,执行SameValueZero比较两者的值
- gt(value,other),检查 value 是否大于 other
- gte(value,other),检查 value 是否大于或等于 other
- lt(value,other),检查 value 是否小于 other
- lte(value,other),检查 value 是否小于等于 other
- isArguments(value),检查 value 是否是一个类 arguments 对象
- isArray(value),检查value是否是 Array 类对象
- isArrayBuffer(value),检查value是否是 ArrayBuffer对象
- isArrayLike(value),检查value是否是类数组
- isBoolean(value),检查value是否是原始 boolean 类型或对象
- isBuffer(value),检查value是否是个 buffer
- isDate(value),检查value是否是Date对象
- isElement(value),检查value是否可能是 DOM 对象
- isEmpty(value),检查 value 是否是一个空对象,集合,映射或者 set,判断的依据是除非是有枚举属性的对象,length 大于 0 的 arguments object, array, string 或类jquery选择器。
- isEqual(value,other),执行深比较来确定两者的值是否相等
- isEqualWith(value,other,[customizer]),接收一个 customizer 用来定制比较值
- isError(value), 检查 value 是否是Error,EvalError,RangeError,ReferenceError,SyntaxError,TypeError 或者 URIError
- isFinite(value),检查 value 是否是原始有限数值
- isFunction(value),检查 value 是否是Function 对象
- isInteger(value),检查 value 是否是整数
- isLength(value),检查 value 是否为有效的长度
- isMap(value),检查 value 是否为一个 Map 对象
- isMatch(object,source),执行一个深度比较,来确定 object 是否含有和 source 完全相等的属性值
- isMatch(object,source,[customizer]),接收一个 customizer 定制比较的值
- is(NaN(value),检查 value 是否是NaN
- isNative(value),检查 value 是否是一个原生函数
- isNil(value),检查 value 是否是null 或者 undefined
- isNull(value),检查 value 是否是null
- isNumber(value),检查 value 是否是Number 数值型或对象
- isObject(value),检查是否为 object 的 language type, 例如: arrays,functions,objects,regexes, new Number(0),以及 new String('')
- isObjectLike(value),检查 value 是否是类对象,如果是类对象,那么它不应该是null,而且 typeof 后的结果是 object
- isPlainObject(value),检查 value 是否是普通对象,也就是该对象由 object 构造函数创建
- isRegExp(value), 检查 value 是否为 RegExp 对象
- isSafeInteger(value),检查 value 是否是一个安全整数
- isSet(value),检查 value 是否是一个 Set 对象
- isString(value),检查 value 是否是原始字符串 String 或对象
- isSymbol(value),检查value 是否是原始 Symbol 或对象
- isTypeArray(value),检查value 是否是 TypedArray
- isUndefined(value),检查 value 是否是 undefined
- isWeakMap(value),检查 value 是否是 WeakMap 对象
- isWeakSet(value),检查 value 是否是 WeakSet 对象
类型转换
- toArray(value),将 value 转换为一个数组
- toFinite(value),将value 转换为一个有限数字
- toInteger(value),将 value 转换为一个整数
- toLength(value),将value 转换为类数组对象的长度整数
- toNumber(value),将 value 转换为一个数字
- toPlainObject(value),将value 转换为普通对象,包括继承的可枚举属性
- toSafeInteger(value),将 value 装换为安全整数,安全整数可用于比较和准群的表示
- toString(value),将 value 转换为字符串,null 和 undefined 将返回空字符串
数学计算
- add(augend,addend) 两数相加
- multiply(multiplier,multiplicand) 两数相乘
- divide(dividend,divisor),两数相除
- subtract(minuend,subtrahend),两数相减
- ceil(number,[precision=0]),向上取整,precision精度,保留几位小数
- floor(number,[precision=0]),向下取整,precision精度,保留几位小数
- max(array),取 array 中的最大值,如果未空或者假值,则返回 undefined
- maxBy(array,[iteratee=_.identity]), 根据传入的 iteratee 规则来获取最大值
- mean(array),计算 array 的平均值
- meanBy(array,[iteratee=_.identity]),根据传入的 iteratee 来取平均值
- min(array),取最小值
- minBy(array,[iteratee=_.identity]),根据传入的 iteratee 来取最小值
- round(number, [precision=0]), 根据 precision(精度)四舍五入 number
- sum(array), 计算 array 的总和
- sumBy(array,[iteratee=_.identity]), 根据传入的 iteratee 来计算总和
实用函数
- clamp(number,[lower], upper),返回限制在 lower 和 upper 之间的值
- inRange(number,[start=0], end),检查 number 是否在 start 和 end 之间
_.inRange(3, 2, 4);// true
- random([lower=0],[upper=1],[floating]),产生一个包括 lower 与 upper 之间的数,如果 floating设为 true,或者 lower 或 upper 是浮点数,结果返回浮点数
- attempt(func,[args]),尝试调用 func,返回结果或者捕捉错误对象,任何传入的参数都会在调用时传给 func
- bindAll(object,methodNames),绑定一个对象的方法到对象本身,覆盖现有方法
- default(value,defaultValue),检查 value,以确定一个默认值是否应被返回,如果 value 为NaN,null,undefined,那么返回 defaultValue 默认值
- range([start=0],end,[step=1]),创建一个包含从 start 到 end,但不包含 end 本身范围数字的数组
_.range(0, -4, -1);// => [0, -1, -2, -3]
- rangeRight([start=0],end,[step=1]), 跟 range一样,不过是降序生成的
- times(n,[iteratee=_.identity]),调用 iteratee n 次,每次调用返回的结果存入到数组中,iteratee 传入一个 index 参数
- uniqueId([prefix='']),生成唯一 ID, 如果提供了 prefix,会被添加到 ID前缀上
更多详细内容参见 Lodash 中文文档