结合替换和json.stringify中的字段

时间:2019-08-15 15:05:09

标签: javascript json stringify

使用json.stringify时如何同时使用字段白名单和替换功能?

说明如何使用字段列表。

有一个用于过滤空值的答案:https://stackoverflow.com/a/41116529/1497139

基于该代码段,我正在尝试:

var fieldWhiteList=['','x1','x2','children'];

let x = {
  'x1':0,
  'x2':null,
  'x3':"xyz", 
  'x4': null,
   children: [
     { 'x1': 2, 'x3': 5},
     { 'x1': 3, 'x3': 6}
   ]
}

function replacer(key,value) { 
  if (value!==null) {
    if (fieldWhiteList.includes(key)) 
      return value;
  }
}
console.log(JSON.stringify(x, replacer,2));

结果是:

{
  "x1": 0,
  "children": [
    null,
    null
  ]
}

这不是我所期望的。我希望孩子会看到x1值,而不是空值。

我如何获得预期的结果?

另请参阅jsfiddle

1 个答案:

答案 0 :(得分:1)

By adding some debug output to the fiddle

function replacer(key,value) { 
  if (value!==null) {
    if (fieldWhiteList.includes(key)) 
      return value;
  }
  console.log('ignoring '+key+'('+typeof (key)+')');
}

我得到了输出:

ignoring x2(string) 
ignoring x3(string) 
ignoring x4(string) 
ignoring 0(string) 
ignoring 1(string) 
ignoring 2(string) 
{
  "x1": 0,
  "children": [
    null,
    null,
    null
  ]
} 

表明键可能是数组索引。在这种情况下,它们都是字符串格式的从0到n的所有数字,因此:

adding a regular expression to match numbers解决了该问题

function replacer(key,value) { 
  if (value!==null) {
    if (fieldWhiteList.includes(key)) 
      return value;
    if (key.match('[0-9]+'))
      return value;
  }
  console.log('ignoring '+key+'('+typeof (key)+')');
}

具有预期的输出:

ignoring x2(string) 
ignoring x4(string) 
{
  "x1": 0,
  "x3": "xyz",
  "children": [
    {
      "x1": 2,
      "x3": 5
    },
    {
      "x1": 3,
      "x3": 6
    },
    {
      "x1": 4,
      "x3": 7
    }
  ]
}