说这个功能其实只是要分享JSON.stringify的第二个参数,先看例子
根据obj的key,批量保留或是删除对应的属性
// 目标对象
const example = {
name:"不知名前端",
age:18,
height:180,
weight:150,
sex:'boy',
}
// 保留属性集合
const keepAddr = ['age','name','height'];
// 删除属性集合
const deleteAddr = ['height','sex','age'];
// 定义omit函数
function omit(obj,arr,type ='omit'){
if(typeof obj !== 'object' || !Array.isArray(arr)) return;
let tempArr = [];
if(type === 'omit'){
tempArr = Object.keys(obj).filter(i => !arr.includes(i));
}else{
tempArr = [...arr];
}
// 核心方法
return JSON.parse(JSON.stringify(obj,tempArr));
}
const obj1 = omit(example,keepAddr,'keep');
const obj2 = omit(example,deleteAddr,'omit');
console.log(obj1);
/**
* {
* age:18,
* height:180,
* name:"不知名前端"
* }
*/
console.log(obj2);
/**
* {
* name:"不知名前端"
* weight:150
* }
*/
JSON.stringify(value,replacer,space)
以上的例子,核心就是利用JSON.stringify的第二个参数,对传入的数组类型的属性集合中的属性进行序列化.
也就是说,第一个参数接收一个对象,第二个参数接收一个数组.它会根据数组中包含的属性对obj进行序列化.也就达到了过滤对象属性的目的.当然这种方式的弊端,和利用JSON.stringify进行深拷贝一样,只能进行简单的拷贝,无法保留函数,原型链等等.
关于JSON.stringify的第二个参数还可以接收一个函数,甚至还有第三个参数,这些我们可以在mdn的文档获得更多的帮助.
MDN文档关于JSON.stringify的详细介绍