源码共读第36期omit.js 剔除对象中的属性

188 阅读1分钟
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;
}

源码很简单,遍历fields获取key,然后删除对象中对应的key。 但是也有个缺点就是对象嵌套时候无法将嵌套的对象中的key删除。 下面改写了下原来的方法,使得对象嵌套也能删除(为了方便使用了ES6的Set)

function omit(obj, fields) {
  const keySet = new Set(fields);
  const shallowCopy = Object.assign({}, obj);
  deleteKey(shallowCopy);
  return shallowCopy;
  
  function deleteKey(obj) {
    Object.keys(obj).forEach((key) => {
      if (keySet.has(key)) {
        delete obj[key];
      } else if (
        Object.prototype.toString.call(obj[key]) === "[object Object]"
      ) {
        deleteKey(obj[key]);
      }
    });
  }
}

image.png

跑了下新的测试用例 通过

image.png

  • 感受

加了源码学习群很久才第一次写源码共读的文章,昨天看到了若川大佬的朋友圈,想想还是动起手来写一下吧。希望这个活动越来越好吧。