JS:使用lodash的omit滤除对象中的非空属性

文章讲述了在工作中遇到的问题,即使用lodash的pickBy方法无法按预期滤除对象中的false值,而通过改用omit函数结合_.isNULL成功解决了问题,实现了只滤除null属性,保留false等非空值的效果。

在工作中,需要滤除对象中的空值,将非空值转给后端。

前期采用网友给出的pickBy滤除对象的方法,发现是有问题的:

const data = {
    姓名:"张三",
    性别: "男",
    有效: false,
    职业: null
}

const tmp = _.pickBy(data)
console.log(JSON.stringify(tmp))

希望输出: { "姓名":“张三, "性别":"男", "有效": false}

实际输出结果为:{ " 姓名":"张三","性别": "男"}

可见,有效: false也被滤除掉了。这是不对的,不是我们希望的结果。

于是想到用lodash的omit函数:

const tmp = _.omit(data, _.isNuLL)

将空属性给滤除掉。这样就正常了,输出:

{ "姓名":"张三", "性别": "男", "有效":"false"}

该方法在网上搜不到,自己记录一下,希望对大家有帮助。

<think> 我们使用lodashomitBy方法可以过滤对象的属性。omitBy方法接受两个参数:第一个参数是源对象,第二个参数是一个断言函数。该函数对对象的每个属性进行调用,如果返回真值,则移除该属性,否则保留。 由于问题中要求去掉属性名为"catalogs"的属性,我们可以这样写: 注意:lodashomitBy会返回一个新的对象,不会修改原对象。 实现代码: ```javascript const _ = require('lodash'); // 假设我们有一个对象 const obj = { name: 'John', age: 30, catalogs: ['catalog1', 'catalog2'], city: 'New York' }; // 使用omitBy,我们判断属性名是否等于'catalogs' const newObj = _.omitBy(obj, (value, key) => key === 'catalogs'); console.log(newObj); // 输出: { name: 'John', age: 30, city: 'New York' } ``` 解释: - 我们使用了`_.omitBy`方法,它遍历对象的每个属性。 - 对于每个属性,调用提供的函数,传入属性值(value)和属性名(key)。 - 当属性名等于'catalogs'时,函数返回true,因此该属性会被移除。 - 注意:这里我们只关心属性名,所以忽略属性值。 另外,如果只想去掉一个已知属性名的属性,也可以使用`_.omit`,它接受一个属性名的数组: ```javascript const newObj2 = _.omit(obj, ['catalogs']); ``` 这样也可以达到同样的效果。 如果你有多个属性需要移除,可以在数组中添加多个属性名。 但是,根据问题,我们只需要移除'catalogs',所以两种方法都可以。 最后,请注意确保已经安装了lodash。如果没有安装,可以使用npm安装: ``` npm install lodash ``` 现在,根据要求,在最后提出相关问题。 §§相关问题§§: 1. 如何用lodashomitBy方法移除对象中所有值为空的属性? 2. 在lodash中,omitBy和pickBy有什么区别? 3. 如果不使用lodash,如何用原生JavaScript实现omitBy的功能? 4. 如何用lodash移除对象中的多个指定属性? </think>使用 Lodash 的 `omitBy` 方法可以智能过滤对象属性,以下是如何移除 `catalogs` 属性的详细实现: ```javascript const _ = require('lodash'); // 示例对象 const data = { name: 'Product List', id: 12345, catalogs: ['electronics', 'books'], // 需要移除的属性 description: 'Main product catalog', timestamp: Date.now() }; // 使用 omitBy 移除 catalogs 属性 const filteredData = _.omitBy(data, (value, key) => key === 'catalogs'); console.log('过滤后的对象:', filteredData); /* 输出: { name: 'Product List', id: 12345, description: 'Main product catalog', timestamp: 1647248221950 } */ ``` ### 代码解释: 1. **`_.omitBy()` 方法**: - 第一个参数:要处理的对象 - 第二个参数:断言函数 `(value, key) => key === 'catalogs'` - 当函数返回 `true` 时,**移除**对应的属性 2. **断言函数逻辑**: ```javascript (value, key) => key === 'catalogs' ``` - 检查每个属性的键名是否为 `'catalogs'` - 匹配成功则移除该属性(忽略属性值) 3. **返回值**: - 返回**新对象**(原始对象不会被修改) - 新对象包含所有不满足断言条件的属性 ### 其他实现方式: #### 1. 使用 `_.omit()` 精确移除特定属性: ```javascript // 直接指定属性名移除 const result = _.omit(data, ['catalogs']); ``` #### 2. 移除多个属性: ```javascript // 同时移除 catalogs 和 timestamp const multiRemove = _.omitBy(data, (_, key) => ['catalogs', 'timestamp'].includes(key) ); ``` #### 3. 原生 JavaScript 实现: ```javascript function omitBy(obj, predicate) { return Object.keys(obj).reduce((acc, key) => { if (!predicate(obj[key], key)) { acc[key] = obj[key]; } return acc; }, {}); } ``` ### 注意事项: 1. **性能**:Lodash 的实现经过优化,处理大型对象比原生方法更高效 2. **不变性**:所有 Lodash 对象方法都返回新对象,不会修改原始数据 3. **深层过滤**:如需处理嵌套对象,需结合 `_.mapValues()` 递归操作
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值