如何剔除对象属性?

1,034 阅读1分钟

「我正在参与掘金会员专属活动-源码共读第一期,点击参与

本篇文章讲的是如何剔除对象中的属性?这里使用的是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就到这里了~