- 本文参加了由公众号@若川视野 发起的每周源码共读活动, 点击了解详情一起参与。
- 这是源码共读的第36期,链接:juejin.cn/post/711878…
观望了好久的咸鱼本鱼,终于开始了首次的源码共读。以下笔记仅代表本人的个人理解,有不正确的地方欢迎指正。
omit
- 源码地址:github.com/benjycui/om…
- 作用:剔除对象中的属性
- 特点:仅10行
- 核心代码:
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;
源码解读
用法
const student = {
name: 'libby',
hobby: 'running',
age: 18,
college: {
name: 'ShenZhen University',
major:'computer science'
}
}
omit(student, ['name'])
omit(student, ['college'])
解读
omit函数共接收两个参数,一个是原对象,一个是需要剔除的属性名组成的数组。先是对原有对象做了一个浅拷贝,再对传入需要剔除的属性名列表做个一个遍历,并用delete操作符从新拷贝的对象中剔除相应的属性,最终返回一个新对象。
个人见解
- 在fields为空数组的时候应该及时返回。 从空间复杂度看,omit函数开辟了一个新的引用空间(拷贝了一个对象)。若fields为空数组,则拷贝了一个一模一样的对象。
- 未对fields参数做类型校验,可能导致产生一些其他结果。 如:
const obj = {
a: 1,
b: 2,
c: 3
}
omit(obj, ['a']) // { b: 2, c: 3 }
omit(obj, 'a') // { b: 2, c: 3 }
omit(obj, 'a', 'b') // { b: 2, c: 3 }
omit(obj, 'ab') // { c: 3 }
- 需要注意的是,omit剔除原对象中的属性用的是浅拷贝也就意味着,新旧对象中的引用类型指向同一个地址。
应用场景
结合上述的第1点和第3点,能够想到的场景是,在和服务器进行交互的时候,我们通常会根据后端给的接口参数,来定义相应的变量对象,并绘制页面。有时候有些在前端页面辅助展示的参数,不需要传到后台接口,这时候我们便可以用到omit函数来剔除那些不需要传到接口的属性,同时也不影响当前页面的展示。