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

92 阅读2分钟

观望了好久的咸鱼本鱼,终于开始了首次的源码共读。以下笔记仅代表本人的个人理解,有不正确的地方欢迎指正。

omit

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操作符从新拷贝的对象中剔除相应的属性,最终返回一个新对象。

个人见解

  1. 在fields为空数组的时候应该及时返回。 从空间复杂度看,omit函数开辟了一个新的引用空间(拷贝了一个对象)。若fields为空数组,则拷贝了一个一模一样的对象。
  2. 未对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 }
  1. 需要注意的是,omit剔除原对象中的属性用的是浅拷贝也就意味着,新旧对象中的引用类型指向同一个地址。

应用场景

结合上述的第1点和第3点,能够想到的场景是,在和服务器进行交互的时候,我们通常会根据后端给的接口参数,来定义相应的变量对象,并绘制页面。有时候有些在前端页面辅助展示的参数,不需要传到后台接口,这时候我们便可以用到omit函数来剔除那些不需要传到接口的属性,同时也不影响当前页面的展示。