• 赐你一本_.武林秘籍,Lodash常用的方法帮助你快速开发。


     

    官方文档 https://www.lodashjs.com/

    $ npm i -g npm
    $ npm i --save lodash

    _.clone() 浅拷贝

    1. var obj1 = {
    2. a: 1,
    3. b: {
    4. c: 2
    5. }
    6. };
    7. console.log(obj1); // c = 3
    8. var obj2 = _.clone(obj1);
    9. console.log(obj1, obj2); // c = 3
    10. obj2.b.c = 3
    11. console.log(obj1, obj2); // c = 3

    _.cloneDeep(object) 深拷贝过后的数据不会影响原来的数据

    1. /**
    2. * @description: _cloneDeep(object) 深拷贝过后的数据不会影响原来的数据
    3. * @return {object}
    4. */
    5. let ob = {
    6. a: 1,
    7. b: 2
    8. }
    9. let newOb = _.cloneDeep(ob)
    10. newOb.a = '深拷贝'
    11. console.log('原数据', ob) // 原数据 {a: 1, b: 2}
    12. console.log('新数据', newOb) // 新数据 {a: '深拷贝', b: 2}

    _.debounce 防抖函数 input 事件处理事件进行防抖处理 当用户连续的在输入框里面连续输入的时候会重新执行函数,当用户不输入了就隔一秒执行

    1. /**
    2. * @description 防抖函数 input 事件处理
    3. * _.debounce(func, [wait=0], [options={}])
    4. * func (Function): 要防抖动的函数。
    5. * [wait=0] (number): 需要延迟的毫秒数。
    6. * [options={}] (Object): 选项对象。
    7. * [options.leading=false] (boolean): 指定在延迟开始前调用,默认false。
    8. * [options.maxWait] (number): 设置 func 允许被延迟的最大值。
    9. * [options.trailing=true] (boolean): 指定在延迟
    10. */
    11. // input 事件进行防抖处理 当用户连续的在输入框里面连续输入的时候会重新执行函数,当用户不输入了就隔一秒执行。(用户连续触发,什么时候不连续触发了,才会执行该函数)
    12. input.oninput = _.debounce(function fn() {
    13. console.log('防抖')
    14. }, 1000, {
    15. leading: false,
    16. trailing: true
    17. })
    18. // lodash 默认leading为false、trailing为true,那么最终的效果是在点击后等待1秒才会打印debounce,即延迟之前不执行函数,而是在延迟之后执行 注意 如果反过来就是 先去执行一次函数 没有防抖的效果了

    _.throttle节流函数 按钮连续点击处理 当连续触点击,发事件只在规定的事件里执行一次(一秒内不管你点了多少次直执行一次)

    1. /**
    2. * @description 节流函数 按钮连续点击处理 当连续触点击,发事件只在规定的事件里执行一次(一秒内不管你点了多少次直执行一次)
    3. * _.throttle(func, [wait=0], [options={}])
    4. * func (Function): 要节流的函数。
    5. * [wait=0] (number): 需要节流的毫秒数。
    6. * [options={}] (Object): 选项对象。
    7. * [options.leading=true] (boolean): 指定调用在节流开始前,默认true。
    8. * [options.trailing=true] (boolean): 指定调用在节流结束后,默认true。
    9. */
    10. button.onclick = _.throttle(function () {
    11. console.log('节流')
    12. }, 1000, { leading: false, trailing: true })
    13. // lodash默认 trailing为 true trailing false 在一秒之内上来就执行一次
    14. // trailing为 false trailing true 在一秒之内最后就执行一次
    15. // vue 写法
    16. // methods: {
    17. // throttledMethod: _.throttle(() => {
    18. // console.log('I get fired every two seconds!')
    19. // }, 2000)
    20. // }

    _.zip _zipObject  按照 index 重新组成数组或者对象

    1. /**
    2. * @description: zip() 把各数组中索引值相同的数据放到一起,组成新数组
    3. */
    4. console.log(_.zip(['小明', '小红', '小刚'], ['男', '女', '男'], [12, 13, 14]));
    5. //[["小明", "男", 12],["小红", "女", 13],["小刚", "男", 14]]
    6. /**
    7. * @description: zipObject() 与上面方法一样,区别是它输出的是对象
    8. */
    9. console.log(_.zipObject(['小明', '小红', '小刚'], ['男', '女', '男'], [12, 13, 14]));
    10. //{小明: "男", 小红: "女", 小刚: "男"}

    _.groupBy _.groupBy 排序

    1. /**
    2. * @description: groupBy() 按照一定规则进行分组,key为循环次数,value为匹配到的数组
    3. */
    4. console.log(_.groupBy(['one', 'two', 'three'], 'length'));
    5. //{3: ["one", "two"], 5: ["three"]}
    6. /**
    7. * @description: orderBy() 排序 这个封装好的可以根据对象属性名进行排序,既能升序又能降序
    8. */
    9. var users = [
    10. { 'user': 'fred', 'age': 48 },
    11. { 'user': 'barney', 'age': 34 },
    12. { 'user': 'fred', 'age': 40 },
    13. { 'user': 'barney', 'age': 36 }
    14. ];
    15. console.log(
    16. _.orderBy(users, 'age', 'asc'), //以age属性的值进行升序排序
    17. _.orderBy(users, 'user', 'desc'), //以user属性的值进行降序排序
    18. );

    _.countBy 计算一个数组里面字符串的长度

    1. /**
    2. * @description: countBy() 按照一定规则统计数量,key循环次数,value为匹配到的数量
    3. */
    4. console.log(_.countBy(['abc', 'efg', 'higklmn', 'abc']))//{abc: 2, efg: 1, higklmn: 1} // 按照重复的字符串统计
    5. console.log(_.countBy(['abc', 'efg', 'higklmn', 'abc'], 'length')) // { 3: 3, 7: 1} 按每个字符串的length进行统计,length为3的有两个数据。length为5的有1个数据

    _.at (根据传入属性创建) _.defaults(合并对象) _.invert (key和value反转)_.omit  处理对象(删除对象属性接口不要字段可以删除)

    1. /**
    2. * @description: at() 根据传入的属性创建一个数组
    3. */
    4. var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
    5. console.log(_.at(object, ['a[0].b.c', 'a[1]'])); //[3, 4]
    6. /**
    7. * @description: defaults() 合并对象,与assign()一样,不过assign方法合并时遇到相同的属性,后面的会覆盖前面的。defaults刚好相反,前面的覆盖后面的
    8. */
    9. console.log(
    10. _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }), //{a: 1, b: 2}
    11. _.assign({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }), //{a: 3, b: 2}
    12. );
    13. /**
    14. * @description: invert() 把对象的key与value颠倒,后面的属性会覆盖前面的属性
    15. */
    16. var object = { 'a': 1, 'b': 2, 'c': 1 };
    17. console.log(_.invert(object)); //{1: "c", 2: "b"}
    18. /**
    19. * @description: omit() 删除对象里的属性
    20. */
    21. console.log(_.omit({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c'])); //{b: "2"}

    _.defer _.once 限制函数执行

    1. /**
    2. * @description: defer() 推迟调用函数,在第二次事件循环的时候调用
    3. */
    4. _.defer(function (text) {
    5. console.log(text);
    6. }, '第二次事件循环'); // 第二个输出
    7. console.log('第一次事件循环'); //第一个输出
    8. /**
    9. * @description: once() 函数只能调用一次
    10. */
    11. function fn3(){
    12. console.log('fn3');
    13. }
    14. var newFn3=_.once(fn3);
    15. newFn3();
    16. newFn3(); // fn3

    _.castArray() 强制转为数组,其实就是在外面加一层方括号

    1. /**
    2. * @description: castArray() 强制转为数组,其实就是在外面加一层方括号
    3. */
    4. console.log(
    5. _.castArray('a'), //["a"]
    6. _.castArray({ a: 1, b: 2 }), //[{a: 1, b: 2}]
    7. );

    _.camelCase _.kebabCase _.words处理字符串

    1. /**
    2. * @description: camelCase() 转换字符串为驼峰格式
    3. */
    4. console.log(
    5. _.camelCase('kaivon_chen'), // kaivonChen
    6. _.camelCase('kaivon chen'), // kaivonChen
    7. );
    8. /**
    9. * @description: kebabCase() 转换字符为加-的形式
    10. */
    11. console.log(_.kebabCase('k a i')); //k-a-i
    12. /**
    13. * @description: words() 把字符串的单词拆分成数组
    14. */
    15. console.log(_.words('kaivon chen')); //["kaivon", "chen"]

    _.sample _.sampleSize 数组里随机数据

    1. /**
    2. * @description: sample() 从数组中随机取一个数据
    3. */
    4. console.log(_.sample(['a', 'b', 'c', 'd', 'e']));
    5. // sampleSize() 获得 n 个随机数据
    6. console.log(_.sampleSize(['a', 'b', 'c', 'd', 'e'], 3));

    _.flattenDeep(array) 将多维数组转为一维数组

    1. /**
    2. * @description: _.flattenDeep(array) 将多维数组转为一维数组
    3. * @return { Array }
    4. */
    5. let arr = [13, [342, 432, [432, 43]]]
    6. console.log(_.flattenDeep(arr)) // [13, 342, 432, 432, 43]
    7. console.log(_.flatten(arr)) // [13, 342, 432, Array(2)] 只扁平一层 js 有方法 flat

    _.compact(array),去除假值。(将所有的空值,0,NaN过滤掉)

    1. /**
    2. * @description: _.compact(array),去除假值。(将所有的空值,0,NaN过滤掉)
    3. * @return { Array }
    4. */
    5. let arr1 = ['', null, NaN, undefined, 0, false, true]
    6. console.log(_.compact(arr1)) // true

    _.isNaN 用来判断是否为NaN _.isString 是否为字符串  举一反三(看文档)

    1. /**
    2. * @description: _.isNaN 用来判断是否为NaN
    3. * @return { Boolean }
    4. */
    5. console.log(_.isNaN(+'str')) // true
    6. console.log(_.isNaN(42)) // false
    7. /**
    8. * @description: _isString
    9. * @return { Boolean }
    10. */
    11. console.log(_.isString('str')) // true
    12. console.log(_.isString(42)) // false
    13. /**
    14. * @description 判断是否为undefined
    15. * @returns 返回布尔值
    16. */
    17. console.log(_.isUndefined(a.b)) // => true
    18. console.log(_.isUndefined(a)) // => false
    19. console.log(_.isUndefined(1)) // => false

    _.get方法,用于解决a.b.c.d出现undefined导致代码报错不继续向下执行

    1. /**
    2. * @description get方法,用于解决a.b.c.d出现undefined导致代码报错不继续向下执行
    3. * @param {Object} [object] 目标对象
    4. * @param {String} [path] 需要取值路径
    5. * @param {*} [defaultVal] 值不存在时候的默认值
    6. */
    7. let obj = { 'a': [{ 'b': { 'c': 999 } }] };
    8. console.log(_.get(obj, 'a[0].b.c')) // 999
    9. console.log(obj.a[0].b.c) // 没有用_.get 999
    10. // console.log(obj.a[0].k.c) // Uncaught TypeError: Cannot read properties of undefined (reading 'c') 无法读取报错
    11. console.log(_.get(obj, 'a[0].k.c')) // 用了 _.get undefined
    12. console.log(_.get(obj, 'a[0].k.c', 3422332)) // 第三个参数就是当无法读取属性就取第三个参数默认值

    _.getObjArray 返回指定对象的 key 的值的数组,支持多层属性嵌套获取,如:obj.x.y.z,快速获取数组内需要的key值数组

    1. /**
    2. *@description _getObjArray 返回指定对象的 key 的值的数组,支持多层属性嵌套获取,如:obj.x.y.z,快速获取数组内需要的key值数组
    3. *@param {Array} [objects] 目标对象
    4. */
    5. var objects = [
    6. { 'a': { 'b': { 'c': 2 } } },
    7. { 'a': { 'b': { 'c': 1 } } }
    8. ]
    9. let _getObjArray = function (objects, path) {
    10. return _.map(objects, _.property(path))
    11. }
    12. console.log(_getObjArray(objects, 'a.b.c')) // => [2, 1]

    _.uniq数组去重   _.union()    取数组的并集(合并起来,去掉重复的)(纯数组)

    1. /**
    2. *_uniq
    3. * @description 数组去重(纯数组)
    4. */
    5. var a = [1, 2, 1, 5, 1, 9]
    6. console.log(_.uniq(a)) // => [1, 2, 5, 9]
    7. /**
    8. * @description: union() 取数组的并集(合并起来,去掉重复的)
    9. */
    10. console.log(_.union([2], [1, 2])); //[2, 1]

    _.pick 创建一个从 object 中选中的 key 的对象

    1. /***
    2. * @description _pick 创建一个从 object 中选中的 key 的对象。
    3. * */
    4. var object1 = { 'a': 1, 'b': '2', 'c': 3 }
    5. console.log(_.pick(object1, ['a', 'c'])) // => { 'a': 1, 'c': 3 }
    6. var object2 = { 'a': 1, 'b': '2', 'c': 3 }
    7. console.log(_.pick(object2, ['b', 'c'])) // => { 'b': '2', 'c': 3 }

    _.omit反向版 pick

    1. /***
    2. * _omit
    3. * @description 反向版 pick
    4. */
    5. var object3 = { 'a': 1, 'b': '2', 'c': 3 }
    6. console.log(_.omit(object3, ['a', 'c'])) // => { 'b': '2' }

    _.chunk() 把数组拆分成一个二维数组,拆分后的第1个数组的长度为第二个参数的值

    1. /**
    2. * @description: chunk() 把数组拆分成一个二维数组,拆分后的第1个数组的长度为第二个参数的值
    3. */
    4. console.log(_.chunk(['a', 'b', 'c', 'd'], 2)); //[["a", "b"],["c", "d"]]

    _.difference _.drop() _.difference() 切割数组

    1. /**
    2. * @description: difference() 在第一个数组中把第二个数组里的数据都排除掉
    3. */
    4. console.log(_.difference([1, 3, 5, 7, 9], [3, 7])); // [1, 5, 9]
    5. /**
    6. * @description: drop() 切掉数组的前n(第二个参数,默认为1)位
    7. */
    8. console.log(_.drop(['a', 'b', 'c', 'd', 'e'], 2)); //['c', 'd', 'e']
    9. /**
    10. * @description: difference() 在第一个数组中把第二个数组里的数据都排除掉
    11. */
    12. //dropRight() take() 保留数组的前n(第二个参数,默认为1)位。与drop方法相反
    13. console.log(_.take(['a', 'b', 'c', 'd', 'e'], 2));

  • 相关阅读:
    C++面向对象程序设计 - 构造函数
    数字化工厂管理系统的三个关键技术是什么
    283. 移动零
    lvs负载均衡集群
    自定义md-loader来简单高效的维护组件文档
    Java文件输入输出(简单易懂版)
    Linux下 coredump 文件定位方法说明
    SSM+优秀宿舍评选系统毕业设计-附源码221511
    缺流量时代,App们需要如何突围?
    【C++】继承 ⑧ ( 继承 + 组合 模式的类对象 构造函数 和 析构函数 调用规则 )
  • 原文地址:https://blog.csdn.net/qq_54753561/article/details/126918862