本文已参与「新人创作礼」活动,一起开启掘金创作之路。
本文参加了由公众号@若川视野 发起的每周源码共读活动, 点击了解详情一起参与。
这是源码共读的第36期 | 可能是历史上最简单的一期 omit.js 剔除对象中的属性
package.json
"main": "lib/index.js", // 入口文件
"module": "es/index.js", // ESM规范声明入口文件
"types": "index.d.ts", // ts 类型声明文件
主代码
/**剔除对象中的属性: 将对象 ojb 剔除 指定的键值对
* Object {obj}
* Array {fields}
*/
function omit(obj, fields) {
const shallowCopy = Object.assign({}, obj); // 浅复制一份对象
for (let i = 0; i < fields.length; i += 1) { // 遍历fields一般比遍历shallowCopy更少
const key = fields[i]; // 当前键
delete shallowCopy[key]; // 删除对象中的 key-value 对
}
return shallowCopy;
}
// 例子
let obj = { a: 'a', b: 'b'}
let fields1 = ['a']
let ret = omit(obj, fields1) // {b: 'b'}
let fields2 = ['a', 'b']
let ret = omit(obj, fields2) // {}
console.log(obj) // { a: 'a', b: 'b'}
export default omit;
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, []);
assert.deepEqual(copy, benjy); // true, 值一样
assert.notEqual(copy, benjy); // false, 指针不一样
});
it('should drop fields which are passed in', () => {
const benjy = { name: 'Benjy', age: 18 };
assert.deepEqual(omit(benjy, ['age']), { name: 'Benjy' }); // true, 值一样
assert.deepEqual(omit(benjy, ['name', 'age']), {}); // true, 值一样
});
});
ts
declare function Omit<T, K extends keyof T>(
obj: T,
keys: Array<K>
): Omit<T, K>;
export default Omit;
包类
- father 用于打包
- ✔︎ 基于 docz 的文档功能(不再维护,建议 迁移到 dumi 或 单独安装 docz 使用)
- ✔︎ 基于 rollup 和 babel 的组件打包功能
- ✔︎ 支持 TypeScript
- ✔︎ 支持 cjs、esm 和 umd 三种格式的打包
- ✔︎ esm 支持生成 mjs,直接为浏览器使用
- ✔︎ 支持用 babel 或 rollup 打包 cjs 和 esm
- ✔︎ 支持多 entry
- ✔︎ 支持 lerna
- ✔︎ 支持 css 和 less,支持开启 css modules
- ✔︎ 支持 test
- ✔︎ 支持用 prettier 和 eslint 做 pre-commit 检查
const base = require('@umijs/fabric/dist/eslint');
module.exports = {
...base,
rules: {
...base.rules,
'no-template-curly-in-string': 0,
'prefer-promise-reject-errors': 0,
'react/no-array-index-key': 0,
'react/sort-comp': 0,
'import/no-named-as-default': 0,
'import/no-named-as-default-member': 0,
},
};
// `"off"` or `0` - turn the rule off(关闭检查)
// `"warn"` or `1` - turn the rule on as a warning (doesn't affect exit code)(警告,不影响代码运行)
// `"error"` or `2` - turn the rule on as an error (exit code will be 1)(报错,影响代码运行)
总结:
- 对于ommit方法原解读与实现
- 对 ts 语法的学习
- 对相应包的了解与学习
- 对packge.json 的关键字的学习