日常开发中我们会经常会使用JSON.stringify将对象转字符串或者数据本地序列化操作,那么如果需要对序列化对象进行过滤或者转换等预处理操作,该如何处理呢?
其实JSON.stringify有三个参数,即JSON.stringify(value,replacer,space)
- value 序列化值
- replacer 预处理参数,类型可以是函数也可以数组
- space 序列化之后键值的空格符长度
使用replacer可以对复杂数据进行预处理
- replacer为函数时
//实际场景中,如对后端用户权限数据或者权限菜单,无用的字段进行过滤,减少缓存
//比如以下数组,过滤出a的属性值
const a = [{a:1,b:2},{a:3,b:3}]
const b = JSON.stringify(a,function (k,v) {
console.log('k',typeof k,k,'/n','v',v)
// k === '' 第一次遍历时的k为空字符串,返回的对象本身
// 对象是数组时,k的键值为索引
// !Number.isNaN(Number(k)) 判断是否为索引,是索引直接返回a[k]
// k==='a' 只返回a键
if(k === '' || !Number.isNaN(Number(k)) || k==='a') return v
})
// '[{"a":1},{"a":3}]'
- replacer为数组时
//replacer为数组时可以用来过滤对象和数组
//对无用的属性可以过滤掉,减少序列化内存
const a = {
name:'Jack',
job:'IT',
age:25,
hoby:'football',
}
JSON.stringify(a,['name','job'])
//'{"name":"Jack","job":"IT"}'
const b = [
{name:'Jack',age:18},
{name:'Tom',age:20},
{name:'Lucy',age:22},
]
JSON.stringify(a,['name'])
// '[{"name":"Jack"},{"name":"Tom"},{"name":"Lucy"}]'
预处理参数为数组时真的是太方便我们对数据过滤了,减少序列化内存的同时简单易操作
PS:
JSON.stringify(value) 也可以用于对象的深拷贝,但有局限性,就是对象的属性类型有限制,以下便是几种常见的限制
- 函数,undefined,Symbol作为value时,返回undefined
- 函数,undefined,Symbol作为对象的键时,会被忽略。比如JSON.stringify({function(){},Symbol():'a'}) ,返回'{}'
- 函数,undefined,Symbol作为数组对象时,返回null