Lodash方法总结

目录

[1. _.defaults()为对象填充默认值](#1. _.defaults()为对象填充默认值)

基本语法

功能说明

示例代码

注意事项

与其他类似方法的区别

[2. _.pickBy()删除对象中值为空串或 null 的属性](#2. _.pickBy()删除对象中值为空串或 null 的属性)

实现方法

代码说明

扩展:深层过滤

3._.omitBy()移除满足条件的属性

基本语法

核心功能

示例代码

[1. 基础用法(移除 falsy 值)](#1. 基础用法(移除 falsy 值))

[2. 自定义判断函数(移除特定类型)](#2. 自定义判断函数(移除特定类型))

[3. 基于属性名的筛选](#3. 基于属性名的筛选)

注意事项

适用场景


  1. _.defaults()为对象填充默认值

用于为对象填充默认值。它会将源对象的属性复制到目标对象中,但仅当目标对象中不存在这些属性时才会进行复制。

基本语法

javascript

javascript 复制代码
_.defaults(target, [source1], [source2], ...)
  • target:目标对象,将被填充默认值
  • [source]:一个或多个源对象,提供默认值

功能说明

  1. 该函数会遍历所有源对象的属性
  2. 对于每个属性,只有当目标对象中不存在该属性时,才会从源对象复制到目标对象
  3. 如果有多个源对象,后面的源对象不会覆盖前面源对象已经设置的属性
  4. 返回填充后的目标对象(与传入的目标对象是同一个引用)

示例代码

javascript

javascript 复制代码
const _ = require('lodash');

// 目标对象
const user = {
  name: 'John'
};

// 源对象 - 提供默认值
const defaults1 = {
  age: 30,
  city: 'New York'
};

const defaults2 = {
  age: 25,
  country: 'USA'
};

// 应用默认值
_.defaults(user, defaults1, defaults2);

console.log(user);
// 输出: { name: 'John', age: 30, city: 'New York', country: 'USA' }

在这个例子中:

  • user 对象已有 name 属性,所以不会被覆盖
  • age 属性从第一个源对象 defaults1 获取,第二个源对象 defaults2age 不会覆盖它
  • citycountry 从相应的源对象获取,因为目标对象中原本没有这些属性

注意事项

  1. _.defaults 是浅拷贝,只会复制对象的顶层属性
  2. 如果属性值是对象,不会进行深层合并,而是直接替换(如果目标对象中没有该属性)
  3. _.assign 不同,_.defaults 不会覆盖目标对象已有的属性

与其他类似方法的区别

  • _.defaults:源对象属性仅在目标对象没有该属性时才会被复制
  • _.assign:源对象属性会覆盖目标对象的同名属性
  • _.merge:会进行深层合并,而不仅仅是浅拷贝

这个方法在需要为配置对象提供默认值的场景中非常有用,确保某些必要属性始终存在。

2. _.pickBy()删除对象中值为空串或 null 的属性

常用的实现方式是使用 _.pickBy() 方法配合自定义判断函数。

实现方法

_.pickBy() 方法会创建一个新对象,只包含原对象中通过判断函数的属性。我们可以利用这一点过滤掉值为空串或 null 的属性。

示例代码:

javascript

javascript 复制代码
const _ = require('lodash');

// 原始对象
const obj = {
  name: "Alice",
  age: null,
  address: "",
  email: "alice@example.com",
  phone: ""
};

// 删除值为 null 或空串的属性
const filteredObj = _.pickBy(obj, (value) => {
  // 保留值既不是 null 也不是空串的属性
  return value !== null && value !== "";
});

console.log(filteredObj);
// 输出: { name: "Alice", email: "alice@example.com" }

代码说明

  • _.pickBy(obj, predicate) 接收两个参数:原对象和判断函数
  • 判断函数 (value) => value !== null && value !== "" 会检查每个属性值:
    • 当值不是 null 且不是空串时,返回 true(保留该属性)
    • 否则返回 false(过滤掉该属性)
  • 该方法会返回一个新对象,不会修改原对象

扩展:深层过滤

如果需要处理嵌套对象,可以结合 _.transform() 实现深层过滤:

javascript

javascript 复制代码
function deepFilter(obj) {
  return _.transform(obj, (result, value, key) => {
    // 如果是对象且不是 null,递归处理
    if (_.isObject(value) && value !== null) {
      const filtered = deepFilter(value);
      if (!_.isEmpty(filtered)) {
        result[key] = filtered;
      }
    } 
    // 过滤掉 null 和空串
    else if (value !== null && value !== "") {
      result[key] = value;
    }
  });
}

// 测试嵌套对象
const nestedObj = {
  a: null,
  b: "",
  c: {
    d: "",
    e: null,
    f: "hello"
  }
};

console.log(deepFilter(nestedObj)); 
// 输出: { c: { f: "hello" } }

这种方式可以灵活处理各种复杂对象结构,满足不同场景的需求。

3._.omitBy()移除满足条件的属性

与_.pickBy()的筛选逻辑恰好相反,

基本语法

javascript

运行

javascript 复制代码
_.omitBy(object, [predicate=_.identity])
  • 参数
    • object:需要处理的源对象
    • predicate(可选):判断函数,默认使用 _.identity(直接判断值是否为真)
  • 返回值:一个新对象,包含所有不满足判断函数的属性

核心功能

_.omitBy() 会遍历对象的所有可枚举属性,对每个属性执行判断函数:

  • 若判断函数返回 true:该属性会被移除
  • 若判断函数返回 false:该属性会被保留到新对象中

示例代码

1. 基础用法(移除 falsy 值)

javascript

运行

javascript 复制代码
const _ = require('lodash');

const obj = {
  a: 1,
  b: null,
  c: '',
  d: 0,
  e: undefined,
  f: 'hello'
};

// 移除所有 falsy 值(null、''、0、undefined 等)
const result = _.omitBy(obj, _.isFalsy);

console.log(result);
// 输出: { a: 1, f: 'hello' }
2. 自定义判断函数(移除特定类型)

javascript

运行

javascript 复制代码
const data = {
  name: 'Alice',
  age: 30,
  hobbies: ['reading', 'coding'],
  address: null,
  isStudent: false
};

// 移除数组和布尔值类型的属性
const filtered = _.omitBy(data, (value) => {
  return _.isArray(value) || _.isBoolean(value);
});

console.log(filtered);
// 输出: { name: 'Alice', age: 30, address: null }
3. 基于属性名的筛选

javascript

运行

javascript 复制代码
const config = {
  apiUrl: 'https://api.example.com',
  timeout: 5000,
  debug: true,
  _internalKey: 'secret'
};

// 移除以下划线开头的属性
const publicConfig = _.omitBy(config, (value, key) => {
  return key.startsWith('_');
});

console.log(publicConfig);
// 输出: { apiUrl: 'https://api.example.com', timeout: 5000, debug: true }

注意事项

  1. 不修改原对象_.omitBy() 始终返回新对象,源对象保持不变
  2. 浅处理:只操作对象的顶层属性,不会递归处理嵌套对象
  3. 判断函数参数 :回调函数接收 (value, key) 两个参数,可同时基于值和键进行判断
  4. _.pickBy() 的关系 :两者是反向操作,_.omitBy(obj, fn) 等价于 _.pickBy(obj, (v,k) => !fn(v,k))

适用场景

  • 清理对象中的无效数据(如 null、空串)
  • 移除敏感信息或内部属性
  • 过滤不符合特定条件的属性
  • 数据格式化和预处理

通过灵活定义判断函数,_.omitBy() 可以满足各种对象属性筛选需求,是数据处理中非常实用的工具。

相关推荐
伍哥的传说2 小时前
Lodash-es 完整开发指南:ES模块化JavaScript工具库实战教程
大数据·javascript·elasticsearch·lodash-es·javascript工具库·es模块·按需导入
GISer_Jing2 小时前
低代码拖拽实现与bpmn-js详解
开发语言·javascript·低代码
YAY_tyy2 小时前
基于 Vue3 + VueOffice 的多格式文档预览组件实现(支持 PDF/Word/Excel/PPT)
前端·javascript·vue.js·pdf·word·excel
@areok@2 小时前
C++mat传入C#OpencvCSharp的mat
开发语言·c++·opencv·c#
Yvonne爱编码2 小时前
AJAX入门-AJAX 概念和 axios 使用
前端·javascript·ajax·html·js
小王C语言3 小时前
【C++进阶】---- map和set的使用
开发语言·c++
在路上`3 小时前
前端学习之后端java小白(三)-sql外键约束一对多
java·前端·学习
Elnaij3 小时前
从C++开始的编程生活(8)——内部类、匿名对象、对象拷贝时的编译器优化和内存管理
开发语言·c++
yb0os13 小时前
RPC实战和核心原理学习(一)----基础
java·开发语言·网络·数据结构·学习·计算机·rpc