目录

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

基本语法

功能说明

示例代码

注意事项

与其他类似方法的区别

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

实现方法

代码说明

扩展:深层过滤

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

基本语法

核心功能

示例代码

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

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

3. 基于属性名的筛选

注意事项

适用场景


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

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

基本语法

javascript

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

功能说明

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

示例代码

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 获取,第二个源对象 defaults2 的 age 不会覆盖它
  • city 和 country 从相应的源对象获取,因为目标对象中原本没有这些属性

注意事项

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

与其他类似方法的区别

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

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

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

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

实现方法

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

示例代码:

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

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

运行

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

核心功能

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

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

示例代码

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

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

运行

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

运行

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() 可以满足各种对象属性筛选需求,是数据处理中非常实用的工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96428.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96428.shtml
英文地址,请注明出处:http://en.pswp.cn/web/96428.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#---Expression(表达式)

前言:Expression 是C# 高级编程,表达式的应用场景有 ORM框架:Entity Framework,Dapper等,规则引擎:动态业务规则评估, 依赖注入:高级DI容器实现,测试框架:模拟…

Lodash-es 完整开发指南:ES模块化JavaScript工具库实战教程

简介 Lodash-es 是 Lodash 库的 ES 模块版本,提供了大量实用的 JavaScript 工具函数。它支持按需导入,可以显著减少打包体积,是现代 JavaScript 项目中的首选工具库。 主要特性 ES 模块支持: 完全支持 ES6 模块语法按需导入: 只导入需要的…

26. AI-Agent-Dify

文章目录前言一、Dify入门为什么使用 Dify?Dify 能做什么?二、Dify私有化部署Docker Compose 部署前提条件克隆 Dify 代码启动 Dify更新 Dify访问 Dify自定义配置三、Dify构建企业级Agent应用定义如何使用智能助手添加助手需要的工具配置 Agent配置对话开…

云原生:微服务与Serverless指南

Copilot时代的开发者效能提升 代码生成与补全:减少重复性编码工作,加快开发速度错误检测与修复:实时提示潜在问题,降低调试时间知识获取与学习:帮助开发者快速掌握新语言或框架协作效率:通过AI辅助减少团队…

SpringBoot + Apache Tika:一站式解决文件数据提取难题

在日常开发中,你是否也遇到过这样的窘境:领导甩来需求“把用户上传的 Word、Excel、PDF 里的关键信息扒出来存库”,你却要对着不同格式逐个攻坚——解析 Word 用 POI 还要处理 .doc/.docx 兼容,解析 Excel 要啃合并单元格、公式计…

车牌模拟生成器:Python3.8+Opencv代码实现与商业应用前景(C#、python 开发包SDK)

车牌模拟生成器:Python代码实现与商业应用前景引言在智慧城市建设和汽车行业数字化浪潮中,车牌作为车辆的唯一标识,其相关技术应用正变得越来越重要。今天我们将介绍一个基于Python的车牌模拟生成器,探讨其技术实现、功能特点以及…

小程序非主页面的数据动作关联主页面的数据刷新操作

如果在主页面跳转到其他页面。比如说我的收藏页面,然后有取消收藏的动作,当返回到主页面的时候,如果有关联数据显示在主页面,刷新页面对应的状态。 下面的代码是实现://卡片收藏/取消if (newCollectd) {this.setData({…

后端(fastAPI)学习笔记(CLASS 1):扩展基础

一、python的类型声明1、类型声明的背景和作用python 3.6 版本引入了“类型提示”1、类型提示是一种新的语法,用来声明变量的类型2、提高编译器和工具的支持能力为什么要学习类型提示1、了解类型提示不仅仅对使用FastAPI有帮助,也能提高代码的可读性度和…

2023年系统分析师上半年论文试题分析

试题一 论信息系统的可行性分析信息系统可行性分析的目的是确认在当前条件下企业是否有必要建设新系统,以及建设新系统的工作是否具备必要的条件。如何进行可行性分析是系统分析师所必须面临的问题。请围绕信息系统可行性分析论题,依次从以下三个方面进行…

洛谷 P1967 [NOIP 2013 提高组] 货车运输(kruskal 重构树 + 求路径最小边权)

题目链接 题目难度 洛谷上是蓝题&#xff0c;本人认为评高了&#xff0c;此题思维和实现都不难&#xff0c;应该是绿题。 题目解法概括 kruskal 重构树 倍增优化求路径最小边权 代码 #include <iostream> #include <cstdio> #include <vector> #inclu…

【01】针对开源收银系统icepos (宝塔面板) 详细安装教程详细参考-优雅草卓伊凡

【01】针对开源收银系统icepos (宝塔面板) 详细安装教程详细参考-优雅草卓伊凡引言本文做参考&#xff0c;下篇文章 直接实践&#xff0c;由于已经选型本系统是服务端php开发的系统&#xff0c;他的系统环境如下&#xff1a;系统安装 环境要求ICEPOS对服务器或电脑硬件要求不高…

MySQL的常用命令

目录1. 连接MySQL数据库基本连接语法连接参数说明2. 数据库操作2.1 查看数据库2.2 创建数据库2.3 删除数据库3. 表操作3.1 查看表信息3.2 创建表3.3 常用数据类型3.4 修改表结构3.5 删除表4. 数据操作 (CRUD)4.1 插入数据 (CREATE)4.2 查询数据 (READ)基本查询条件查询排序和分…

Linux: config: CONFIG_CHECKPOINT_RESTORE;CRIU

文章目录 config CHECKPOINT_RESTORE commit related 简介 参考 如何使用 Checkpoint/Restore 功能 步骤 1:确保内核支持 步骤 2:安装 CRIU 步骤 3:检查点(Checkpoint) 步骤 4:恢复(Restore) 步骤 5:验证 常见应用场景 注意事项 python config CHECKPOINT_RESTORE bo…

eclipse怎么把项目设为web

在 Eclipse 中将一个项目设置为 Web 项目&#xff08;或称动态 Web 项目&#xff09;主要有两种场景&#xff1a;​创建新的 Web 项目​ 和 ​将现有项目转换为 Web 项目。我将为你详细讲解这两种方法。前提条件&#xff1a;确保你有必要的 Eclipse 组件在开始之前&#xff0c;…

CVPR 2025|基于视觉语言模型的零样本3D视觉定位

论文信息题目&#xff1a;Zero-Shot 3D Visual Grounding from Vision-Language Models基于视觉语言模型的零样本3D视觉定位作者&#xff1a;Rong Li, Shijie Li, Lingdong Kong, Xulei Yang, Junwei Liang论文创新点提出全新框架&#xff1a;论文提出SeeGround这一无需训练的零…

Realtime API 语音代理端到端接入全流程教程(含 Demo,延迟 280ms)

在现代应用中&#xff0c;实时语音交互已经成为重要功能&#xff0c;而低延迟的语音传输更是用户体验的关键指标。本文将详细介绍如何使用 Realtime API 实现 语音代理 的端到端接入&#xff0c;包括环境搭建、接口调用、低延迟优化及 Demo 演示。通过本教程&#xff0c;开发者…

AI赋能办公:用Python解决发票合并打印难题

一、问题的提出今天网友提问&#xff1a;报销时&#xff0c;财务要求要把发票合并打印&#xff0c;即两张合成一张放在A4纸上&#xff0c;中间还要加一道黑色分界线&#xff0c;如何快速完成数十张发票的打印&#xff1f;问题的提出二、问题分析这个问题可以采用两种方法解决&a…

Shell编程之正则表达式与文本处理工具

一、正则表达式基础1. 正则表达式概述​定义​&#xff1a;正则表达式&#xff08;Regular Expression&#xff0c;简称Regex&#xff09;是由普通字符​&#xff08;如字母、数字、标点符号&#xff09;与元字符​&#xff08;具有特殊含义的专用字符&#xff09;组成的字符串…

使用 Spring AI Alibaba Graph 实现工作流

1 依赖<dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter-dashscope</artifactId><version>1.0.0.2</version> </dependency><dependency><groupId>com.alibaba.cloud.…

碰一碰系统源码于小程序打通技术开发整合方案,驱动AI技术开发源代码

碰一碰系统结合小程序开发数据互通&#xff0c;驱动AI技术开发源代码碰一碰系统作为门店获客技术落地的核心载体&#xff0c;已从标准化产品向实体店定制演进。本文从源码d的形式出发&#xff0c;解析企业级数字人分身系统的交互系统&#xff0c;为技术团队提供可落地的开发指南…