你可能没用过的JSON.stringify() replacer

发布时间:2019-02-22 作者:一点通


JSON.stringify()方法是讲一个JavaScript对象或者数组转换为一个JSON字符串,如果指定了replacer是一个函数,则可以替换值,或者如果指定了replacer是一个数组,可选的仅包括指定的属性

JSON.stringify(value[, replacer [, space]])

下面说说replacer的具体使用方式:

1、如果该参数为null或者未提供,则对象所有的属性都会被序列化

JSON.stringify({
    name: "tom",
    age: 22,
    gender: "M"
})

返回

"{"name":"tom","age":22,"gender":"M"}"

2、如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理

JSON.stringify({
    name: "tom",
    age: 20
    gender: "M"
}, (key, value)=>{
    if(key !== 'name'){
        return value
    }
})

返回

"{"age":20,"gender":"M"}"

3、如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的JSON字符串中

JSON.stringify({
    name: "tom",
    age: 20,
    gender: "M"
}, ['name', 'age'])

返回

"{"name":"tom","age":20}"

需要注意的是,当用在嵌套的JSON对象中的时候,是过滤所有层级的属性

JSON.stringify({
    name: "tom",
    age: 20,
    gender: "M",
    friend: {
        age: 12,
        gender: "F"
    }
}, ['name', 'age', 'friend'])

返回

"{"name":"tom","age":20,"friend":{"age":12}}"

可以看到,friend下的gender被过滤掉了,因为gender没有在['name', 'age', 'friend']中,但是如果是这样

JSON.stringify({
    name: "tom",
    age: 20,
    gender:  "M",
    friend: {
        age: 12,
        gender: "F"
    }
}, ['name', 'age'])

返回

"{"name":"tom","age":20}"

所以,只有上一级的属性也在过滤数组中,才会存在下一级