「我正在参与掘金会员专属活动-源码共读第一期,点击参与」
本篇文章讲的是如何剔除对象中的属性?这里使用的是omit.js
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-spread
const 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就到这里了~