-
本文参加了由公众号@若川视野 发起的每周源码共读活动, 点击了解详情一起参与。
-
这是源码共读的第36期,链接:【若川视野 x 源码共读】第36期 | 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;
}
源码很简单,遍历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]);
}
});
}
}
跑了下新的测试用例 通过
- 感受
加了源码学习群很久才第一次写源码共读的文章,昨天看到了若川大佬的朋友圈,想想还是动起手来写一下吧。希望这个活动越来越好吧。