将函数传递给JSON.stringify

时间:2017-07-26 14:14:50

标签: javascript json

我目前正在按照系列文章学习javascript,#34;你不知道js"。

在"类型&部分中语法",在讨论" JSON.stringify"功能,作者提到

var a = {
  b: 42,
  c: "42",
  d: [11,22,33]
};

JSON.stringify( a, ["b","c"] ); // "{"b":42,"c":"42"}"

JSON.stringify( a, function(k,v){
  if (k !== "c") return v;
} );
// "{"b":42,"d":[11,22,33]}"
     

注意:在函数replacer的情况下,键参数k是未定义的   第一次调用(传入一个对象本身)。该   if语句过滤掉名为" c"的属性。字符串化是   递归,因此[1,2,3]数组具有其每个值(1,2和3)   作为v传递给替换者,索引(0,1和2)为k。

所以我发布了以下代码,旨在从22结果中删除值JSON.stringify



var a = {
  b: 42,
  c: "42",
  d: [11, 22, 33]
};

var result = JSON.stringify(a, function(k, v) {
  //since each index 0, 1, 2 of property "c" will be passed into function as "k", 
  //therefore if "k !== 1" should filter out value 22
  if (k !== 1) {
    return v;
  }
});

console.log(result);




我期待结果为"{"b":42,"c":"42","d":[11,33]}"

然而,结果是"{"b":42,"c":"42","d":[11,22,33]}"(如您所见,属性c的索引1处的值22未被过滤掉)

我错过了解作者所说的内容吗?我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

属性名称始终是字符串1 !== "1"。比较字符串而不是数字。

var a = {
  b: 42,
  c: "42",
  d: [11, 22, 33]
};

var result = JSON.stringify(a, function(k, v) {
  if (k !== "1") {       // "1" not 1 here
    return v;
  }
});

console.log(result);

答案 1 :(得分:0)

键将是表示属性名称的字符串,当迭代数组属性时,它将是表示数组索引的字符串。

JSON.stringify迭代器的工作方式是从顶部元素本身开始为对象中的所有元素执行函数。

例如,有你展示的对象:

var a = {
  b: 42,
  c: "42",
  d: [11,22,33]
};

为JSON.stringify提供的函数将针对以下键和值运行:

  • 所有对象{b: 42, c: "42", d: [11,22,33]}没有密钥,因为它是顶级元素,因此在这种情况下,k变量将为undefined
  • 密钥42访问的b值。
  • 密钥"42"访问的c值。
  • 密钥[11,22,33]访问的d值。
  • 密钥11访问的0值。
  • 密钥22访问的1值。
  • 密钥33访问的2值。