【源码共读】omit.js剔除对象中的属性

173 阅读1分钟

本文参加了由公众号@若川视野 发起的每周源码共读活动,点击了解详情一起参与。

【若川视野 x 源码共读】第36期 | 可能是历史上最简单的一期 omit.js 剔除对象中的属性点击了解本期详情一起参与

1.准备源码

git仓库:https://github.com/benjycui/omit.js

clone代码到本地: git clone https://github.com/benjycui/omit.js
按照所有依赖: npm i
运行项目: npm run test
// omit传入两个参数, obj为对象,为需要删除的目标对象
// fields为需要删除的对象的属性的集合,是一个数组
function omit(obj, fields) {
  // 浅拷贝 obj 对象
  // 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;
}

2. 安装 jest 重写测试用例

// 安装依赖
npm i jest -D
// 添加 jest.config.js
npx jest --init

根据提示,按照如下进行配置: image.png 完成后, 在根目录下会生成 jext.config.js, 并且重写了 package.json 下的 script

"scripts": {
   "test": "jest",
   // 原来是  "test": "father test",
}

现在执行命令 npm run test, 报错了...原因是: jest 不能在模块外部使用import语句

image.png 配置babel得以解决:

npm i babel-jest @babel/core @babel/preset-env -D
  // .babel.config.js
  module.exports = {
  presets: [['@babel/preset-env', {targets: {node: 'current'}}]],
};
// .babelrc
 {
  "env": {
    "test": {
      "plugins": ["@babel/plugin-transform-modules-commonjs"]
    }
  }
}

最终: npm run test 执行成功

接下来将 assert 改为 jest

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

describe('omit', () => {
  it('should create a shallow copy', () => {
    const benjy = { name: 'Benjy' };
    const copy = omit(benjy, []);
    expect(copy).toEqual(benjy)
    // assert.deepEqual(copy, benjy);
    // assert.notEqual(copy, benjy);
  });

  it('should drop fields which are passed in', () => {
    const benjy = { name: 'Benjy', age: 18 };
    const target1 = omit(benjy, ['age'])
    const target2 = omit(benjy, ['age', 'name'])
    expect(target1).toEqual({name: 'Benjy'})
    expect(target2).toEqual({})
    // assert.deepEqual(omit(benjy, ['age']), { name: 'Benjy' });
    // assert.deepEqual(omit(benjy, ['name', 'age']), {});
  });
});

image.png

总结:

  1. 了解 Object.assign 浅克隆
  2. omit方法剔除对象属性
  3. jest 单元测试