本文参加了由公众号@若川视野 发起的每周源码共读活动,点击了解详情一起参与。
【若川视野 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
根据提示,按照如下进行配置:
完成后, 在根目录下会生成
jext.config.js, 并且重写了 package.json 下的 script
"scripts": {
"test": "jest",
// 原来是 "test": "father test",
}
现在执行命令 npm run test, 报错了...原因是: jest 不能在模块外部使用import语句
配置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']), {});
});
});
总结:
- 了解 Object.assign 浅克隆
- omit方法剔除对象属性
- jest 单元测试