在工作中,你可能经常用 JSON.stringify
来将对象序列化成 JSON 字符串。那么,除了常见的用法,你知道 JSON.stringify
还有哪些其他特性和用法吗?接下来,我们一起来看看。
如果你还想了解一些 JSON.parse
的其他用法,可以参考《你不常用的JSON.parse的用法》这篇文章。
语法
JSON.stringify(value[, replacer [, space]])
从语法上来看,value
是我们常用的参数,replacer
和 space
这两个参数较少使用,或者有些人基本没用过。
我们来看一个例子:
const person = {
id: 3508,
name: 'DGF',
age: 30,
address: {
city: 'xm',
},
arr: [1, 2, 3]
}
1. 用来序列化对象
默认情况下,JSON.stringify(obj)
会输出一行字符串:
console.log(JSON.stringify(person));
2. 格式化输出
你可以使用 space
参数来控制 JSON 字符串的格式化,space
表示每个字符的间距,用来控制每行的缩进。
- 4 表示空格缩进:
console.log(JSON.stringify(person, null, 4));
- 使用自定义字符串作为缩进:
console.log(JSON.stringify(person, null, '....'));
3. 筛选属性
replacer
参数可以是一个数组或函数。函数接收两个参数 key
和 value
,其作用是可以选择哪些属性需要被序列化,哪些需要被隐藏。
- 筛选需要序列化的属性:
let test1 = JSON.stringify(person, (key, value) => {
if(key == 'id' || key == 'age') {
return;
}
return value;
});
console.log(test1);
- 筛选值为 number 类型的属性:
let test2 = JSON.stringify(person, (key, value) => {
if(typeof value == 'number') {
return;
}
return value;
});
console.log(test2);
- 使用一个函数过滤多个属性:
function stripKeys(...keys) {
return (key, value) => {
if(keys.includes(key)) {
return;
}
return value;
};
}
console.log(JSON.stringify(person, stripKeys('arr', 'address')));
- 只序列化需要的属性(数组):
console.log(JSON.stringify(person, ['name', 'address', 'city']));
4. 数组筛选
你也可以用 JSON.stringify
来筛选数组中需要的元素。
const person1 = [{
id: 1,
name: 'a',
age: 12,
arr: ['a', 'b', 'c']
}, {
id: 2,
name: 'b',
age: 22,
arr: ['aa', 'bb', 'cc']
}];
console.log(JSON.stringify(person1, ['id', 'age']));
5. 判断数组/对象是否包含某对象
你可以使用 JSON.stringify
判断一个对象是否包含在数组中。
const person2 = {
id: 2,
name: 'b',
age: 22,
arr: ['aa', 'bb', 'cc']
};
console.log(JSON.stringify(person1).indexOf(JSON.stringify(person2)) !== -1); // true
const p3 = {
a: 1,
b: 2,
c: {
d: 5
}
};
const p4 = {
d: 5,
};
console.log(JSON.stringify(p3).indexOf(JSON.stringify(p4)) !== -1); // true
6. 判断数组是否相等
通过 JSON.stringify
,你也可以判断两个数组是否相等:
let arr1 = ['a', 'b'];
let arr2 = ['a', 'b'];
console.log(JSON.stringify(arr1) === JSON.stringify(arr2)); // true
评论区