【源码共读】 | omit.js

182 阅读2分钟

我正在参与掘金创作者训练营第6期,点击了解活动详情

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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

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

前言

本篇内容涉及:

1.omit.js 剔除对象中的属性
2.如何通过测试用例查看代码想要实现的点
3.TypeScript改写

源码地址:github.com/benjycui/om…

我们把源码clone一份下来(或者在github中直接按.打开在线vscode)

omit这个库是干什么的

首先,我们看一下package.json

image-20220830084423814

omit采用umijsnpm包构建工具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;

查看依赖

image-20220830091342925

umi-fabric(github.com/umijs/fabri…

这个库是用来一键配置项目代码规范的

image-20220830091759926

assert

image-20220830092500893

np

更好的发布npm

image-20220830092646204

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({})
  })
})