JS里的JSON.stringify方法一般情况下都可以用。
但如果对象里有symbol的key, 会被忽略,如下例子:
const s = Symbol('wefwef');
const options = {
a: 1,
b: [1,2,],
[s]: 'wath',
where: {
[Symbol('or')]: [{a: '123',[Symbol('in')]:[123]}],
[Symbol('like')]: "%a%",
},
order: null,
1: 'wewr'
};
console.log(JSON.stringify(options));
输出是这样的:
{"1":"wewr","a":1,"b":[1,2],"where":{},"order":null}
有没有一种办法可以输出symbol呢?想到一个办法,看代码:
function stringify(value) {
return JSON.stringify(value, function (k, v) {
if (typeof v === 'symbol') return v.toString();
if (v && v.constructor.name === 'Object') {
const obj = Object.assign({}, v);
const symbols = Object.getOwnPropertySymbols(obj);
for(let i =0; i<symbols.length; obj[symbols[i].toString()] = obj[symbols[i++]]);
return obj;
}
return v;
});
}
利用自带的JSON.stringify, 兼容任何类型。
console.log('kk:', stringify(options))
console.log('kk:', stringify('wefwf'))
console.log('kk:', stringify(12313))
console.log('kk:', stringify([123123]))
console.log('kk:', stringify([{a: 'q'}]))