我正在参与掘金创作者训练营第6期,点击了解活动详情
本文已参与「新人创作礼」活动,一起开启掘金创作之路。
本文参加了由公众号@若川视野 发起的每周源码共读活动,点击了解详情一起参与。
【若川视野 x 源码共读】第36期 | 可能是历史上最简单的一期 omit.js 剔除对象中的属性点击了解本期详情一起参与。
前言
本篇内容涉及:
1.omit.js 剔除对象中的属性
2.如何通过测试用例查看代码想要实现的点
3.TypeScript改写
我们把源码clone一份下来(或者在github中直接按.打开在线vscode)
omit这个库是干什么的
首先,我们看一下package.json
omit采用umijs的npm包构建工具father(github.com/umijs/fathe…
详细的用法可以自行了解,这边大概是用这个工具是用来构建包的即可。
- 安装项目依赖
npm i
- 查看测试用例
npm test
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']), {});
});
});
我们可以看出,这是做浅拷贝和剔除对象中的属性,这个和lodash中的omit有点类似,www.lodashjs.com/docs/lodash…
怎么实现的?
使用了Object.assign来拷贝对象,换成{...obj}也可实现浅拷贝,然后操作拷贝后的对象,删除fields值,但是如果对象中存在嵌套对象,则该方法不适用。
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;
查看依赖
umi-fabric(github.com/umijs/fabri…
这个库是用来一键配置项目代码规范的
assert
np
更好的发布npm包
rc-tools
react 组件的离线工具
使用TypeScript改写
- 将测试工具改为
vitest
代码如下:
export function omit(obj: Object, fields: string[]) {
const shallowCopy = { ...obj }
for (let i = 0; i < fields.length; i += 1) {
const key = fields[i]
delete shallowCopy[key]
}
return shallowCopy
}
测试用例如下:
import { omit } from '../src'
import { describe, expect, test } from 'vitest'
describe('omit', () => {
test('should create a shallow copy', () => {
const benjy = { name: 'Benjy' }
const copy = omit(benjy, [])
expect(copy).toStrictEqual(benjy)
expect(copy).not.equal(benjy)
})
test('should drop fields which are passed in', () => {
const benjy = { name: 'Benjy', age: 18 }
expect(omit(benjy, ['age'])).toStrictEqual({ name: 'Benjy' })
expect(omit(benjy, ['name', 'age'])).toStrictEqual({})
})
})