【若川视野 x 源码共读】第36期 | omit.js 剔除对象中的属性

109 阅读1分钟

omit.js 源码

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;

omit.js方法传入两个参数,第一个是要进行操作的对象,第二个参数为第一个对象要删除对象key组成的数组,最终返回删除后的对象。

  1. 代码内部首先使用Object.assign浅拷贝传进来的对象;
  2. 遍历传进来要删除项的数组
  3. 使用delete删除对象的key
  4. 抛出修改后的对象

使用到的依赖

"devDependencies": {
    "@umijs/fabric": "^2.2.2",
    "assert": "^1.4.1",
    "eslint": "^7.4.0",
    "father": "^2.29.5",
    "np": "^6.3.1",
    "rc-tools": "^6.3.3"
  }
  1. umijs/fabric:一个包含 prettier,eslint,stylelint 的配置文件合集
  2. assert:nodejs断言模块,用于test测试
  3. eslint:可配置的 JavaScript 语法规则和代码风格的检查工具
  4. father:father 是一款 NPM 包研发工具,能够帮助开发者更高效、高质量地研发 NPM 包、生成构建产物、再完成发布。它主要具备以下特性:
    • ⚔️ 双模式构建:  支持 Bundless 及 Bundle 两种构建模式,ESModule 及 CommonJS 产物使用 Bundless 模式,UMD 产物使用 Bundle 模式
    • 🎛 多构建核心:  Bundle 模式使用 Webpack 作为构建核心,Bundless 模式使用 esbuild 及 Babel 两种构建核心,可通过配置自由切换
    • 🔖 类型生成:  无论是源码构建还是依赖预打包,都支持为 TypeScript 模块生成 .d.ts 类型定义
    • 🩺 项目体检:  对 NPM 包研发常见误区做检查,让每一次发布都更加稳健
    • 🏗 微生成器:  为项目追加生成常见的工程化能力,例如使用 jest 编写测试
    • 📦 依赖预打包:  开箱即用的依赖预打包能力,帮助 Node.js 框架/库提升稳定性、不受上游依赖更新影响(实验性)

5.np:发布npm

测试

 "scripts": {
    "start": "father doc dev --storybook",
    "build": "father doc build --storybook",
    "compile": "father build",
    "gh-pages": "father doc deploy",
    "prepublishOnly": "npm run compile && np --yolo --no-publish",
    "lint": "eslint .",
    "test": "father test",
    "coverage": "father test --coverage"
  }

执行npm run test,会进入下面的单元测试

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

describe("omit", () => {
  it("should create a shallow copy", () => {
    const benjy = { name: "Benjy" };
    const copy = omit(benjy, ["age"]);
    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"]), {});
  });
});

assert.deepEqual:深度比较 actual 和 expected 参数,使用比较运算符(==)比较原始值。 只考虑可枚举的“自身”属性。
assert.notEqual:使用简单的反向比较运算符 (!=) 来比较实际参数和预期参数。当它们不相等时,断言通过;否则,它会失败。

// 代码通过
Debugger attached.
 PASS  tests/index.test.js
  omit
    ✓ should create a shallow copy (3123ms)
    ✓ should drop fields which are passed in (1ms)

Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        5.217s
Ran all test suites.
Waiting for the debugger to disconnect...
Waiting for the debugger to disconnect...

总结: 这个omit.js方法还是比较简单的,主要是了解到了发布npm的大概操作操作流程,学习到了写测试用例