如何剔除对象属性?

文章介绍了JavaScript库omit.js,它提供了一个API`omit(obj,fields)`,用于创建剔除了指定属性的深拷贝对象。文章展示了如何安装和使用omit.js,以及源码实现,主要通过`Object.assign`进行深拷贝并使用`delete`删除属性。此外,提到了测试用例和使用father作为NPM包研发工具的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

API:

omit(obj: Object, fields: string[]): Object

返回一个被剔除属性的深拷贝对象。

它的API就是很简单,只有一个omit方法,参数是目标对象和剔除属性的集合。

用法

  • 首先安装一下依赖
npm i --save omit.js
npm i -S omit.js 
  • 使用
var omit = require('omit.js');
omit({ name: 'Benjy', age: 18 }, [ 'name' ]); // => { age: 18 } 

源码

function omit(obj, fields) {// eslint-disable-next-line prefer-object-spreadconst shallowCopy = Object.assign({}, obj);for (let i = 0; i < fields.length; i += 1) {const key = fields[i];delete shallowCopy[key];}return shallowCopy;
}

export default omit; 

一共11行代码。 首先使用了Object.assign做了一次深拷贝,然后遍历对象要剔除的fields数组,在循环中获取fields的元素,通过delete将深拷贝的对象属性依次删除,最后返回该对象。

这里深拷贝为了在将来使用该对象时不会影响原来的对象。

测试用例

我们有看到测试用例在这个路径/tests/index.test.js

import assert from 'assert';
import omit from '../src';

describe('omit', () => {it('should create a shallow copy', () => {const benjy = { name: 'Benjy' };const copy = omit(benjy, []);assert.deepEqual(copy, benjy);assert.notEqual(copy, benjy);});it('should drop fields which are passed in', () => {const benjy = { name: 'Benjy', age: 18 };assert.deepEqual(omit(benjy, ['age']), { name: 'Benjy' });assert.deepEqual(omit(benjy, ['name', 'age']), {});});
}); 

第一个测试:深拷贝的对象和原始对象对比 第二个测试:深拷贝的对象剔除属性后的结果是否正确

我们发现一般测试都用的是jest,而它用的是father。从npmjs官网了解到, father 是一款 NPM 包研发工具,能够帮助开发者更高效、高质量地研发 NPM 包、生成构建产物、再完成发布。

然后我们将目光移动到package.json文件上,发现其中的依赖还不少,father,np,还有其他一些eslint依赖。其中father,np在我们发布npm包提供了特别优秀的功能。

结束语:

剔除对象属性omit.js就到这里了~

最后

最近还整理一份JavaScript与ES的笔记,一共25个重要的知识点,对每个知识点都进行了讲解和分析。能帮你快速掌握JavaScript与ES的相关知识,提升工作效率。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

### 删除 Python 对象或字典中的空属性值 在 Python 中,删除对象或字典中的空属性值是一个常见需求。以下是针对不同情况的具体实现方法。 --- #### 方法一:删除对象中的空属性值 对于自定义类实例,可以通过遍历其 `__dict__` 属性来查找并移除值为空的字段[^1]。 ##### 示例代码 以下示例展示了如何安全地删除对象中所有值为 `None` 或其他“假值”的属性: ```python class Person: def __init__(self, name, age=None, address=""): self.name = name self.age = age self.address = address def remove_empty_attributes(obj): """删除对象中所有值为 None 或 False 的属性""" keys_to_remove = [key for key, value in obj.__dict__.items() if not value] for key in keys_to_remove: delattr(obj, key) if __name__ == '__main__': person = Person(name="Alice", age=None, address="") print("删除前:", person.__dict__) remove_empty_attributes(person) print("删除后:", person.__dict__) ``` 运行结果如下: ``` 删除前: {'name': 'Alice', 'age': None, 'address': ''} 删除后: {'name': 'Alice'} ``` 此方法利用了 `not value` 判断语句自动过滤掉诸如 `None`, `False`, 空字符串 (`""`) 等假值类型的属性。 --- #### 方法二:删除字典中的空值键 如果目标是清理字典而非对象,则可以直接构建一个新的不含指定条件(如空值)的副本[^3]。 ##### 示例代码 下面的例子说明了怎样高效剔除字典里那些映射到空白列表或其他零长度容器上的条目: ```python original_dict = { "00": [1, 2, 3], "01": [], "02": ["a", "b"], "03": "", "04": None, } cleaned_dict = {k: v for k, v in original_dict.items() if v} print(cleaned_dict) ``` 执行后的输出将是: ``` {'00': [1, 2, 3], '02': ['a', 'b']} ``` 这里采用了字典解析技术,在保留原有键的同时仅复制非空的内容至新变量之中。 --- #### 方法三:结合装饰器动态管理属性状态 为了增强灵活性与可维护性,还可以借助于 property 装饰符设置 getter/setter/deleter 方法控制访问行为,并在其内部加入额外验证逻辑防止非法赋值发生[^2]。 ##### 示例代码 考虑这样一个场景:我们需要确保某个人员记录的名字不能为空;一旦尝试清空它就触发异常或者干脆彻底销毁该成员变量本身。 ```python class Employee: def __init__(self, emp_id, name): self.emp_id = emp_id self._name = name @property def name(self): return self._name @name.setter def name(self, new_name): if str(new_name).strip(): self._name = new_name else: raise ValueError("Name must not be empty.") @name.deleter def name(self): try: del self._name except AttributeError as err: pass emp = Employee(emp_id=101, name='John Doe') del emp.name # 此处会激活 deleter 自动消除底层 _name 成员 try: print(emp.name) # 尝试读取已丢失的数据将抛出错误 except AttributeError as ex: print(ex) ``` 上述片段清楚表明即使外部试图强制抹去姓名栏位也只会得到预期效果而不会破坏整体程序稳定性[^2]。 --- ### 总结 综上所述,无论是处理单个实体还是批量集合,Python 都提供了丰富的内置工具帮助我们优雅达成目的。具体采用哪种方案取决于实际应用场景和个人偏好等因素综合考量之后再做定夺。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值