JSON 替换器是递归的。这意味着它使用相同的数组all它遇到的物体。换句话说,它使用相同的值来映射BAD.g
的值。自从,Bad.g
的值没有任何与您提供的键匹配的键,因此不会正确映射任何内容。这意味着我们必须将“2”添加到您的数组中。现在“2”也有一个具有不同键的对象。我们已经考虑了“b”,所以现在我们只需将“w”添加到数组中即可。
当向替换器提供数组时,最好将该数组视为以下内容的列表:all您想要映射的键。
DEMO: http://jsfiddle.net/dirtyd77/whv7x6xc/4/ http://jsfiddle.net/dirtyd77/whv7x6xc/4/
console.log(JSON.stringify(BAD, ['a', 'b', 'c', 'd', 'e', 'g', '2', 'w']));
希望这对您有所帮助,如果您有任何疑问,请告诉我。
这也是摘录自的一个片段文档 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#The_replacer_parameter,
如果返回任何其他对象,则该对象会递归地字符串化为 JSON 字符串,对每个属性调用替换函数,除非该对象是函数,在这种情况下,不会向 JSON 字符串添加任何内容。
对于动态键,您始终可以创建一个函数来推送到数组并将该数组用于白名单。这是一个例子:
DEMO: http://jsfiddle.net/dirtyd77/whv7x6xc/5/ http://jsfiddle.net/dirtyd77/whv7x6xc/5/
var BAD = {
"a": "2",
"b": 1,
"c": "Nexus",
"d": "Alligator",
"e": 5,
"f": 1431807036,
"g": {
"2": {
"w": 17,
"b": 5
}
}
}
var whitelist = [];
iterate(BAD);
console.log(whitelist, JSON.stringify(BAD, whitelist));
function iterate(obj){
for(var key in obj){
// may have to do some checking to ignore any keys you don't care about
whitelist.push(key);
// if value is an object, will use this same function to push to whitelist array
if(typeof obj[key] === 'object'){
return iterate(obj[key]);
}
}
}
您也可以只使用现有的whitelist
只需将密钥附加到您的g
键(假设不是动态的):
DEMO: http://jsfiddle.net/dirtyd77/whv7x6xc/6/ http://jsfiddle.net/dirtyd77/whv7x6xc/6/
var whitelist = ['a', 'b', 'c', 'd', 'e', 'g'];
iterate(BAD.g);
console.log(whitelist, JSON.stringify(BAD, whitelist));
function iterate(obj){
for(var key in obj){
whitelist.push(key);
if(typeof obj[key] === 'object'){
return iterate(obj[key]);
}
}
}