2017-07-26 46 views
0

我目前正在学习JavaScript的系列“你不知道js”。传递一个函数到JSON.stringify

部分中“类型&语法”,讨论“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]}" 

注:在功能替代品的情况下,关键参数k的未定义 为第一个调用(其中一个对象本身被传入)。 if语句过滤掉名为“c”的属性。字符串化为 递归,因此[1,2,3]数组将其每个值(1,2和3) 作为v传递给替换器,索引(0,1和2)为k。

所以我用下面的代码出来,旨在从JSON.stringify结果删除值22

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没有被过滤掉)

明白我错过了笔者所说的吗?我错过了什么吗?

+0

@Kaddath - 否替换函数以递归方式运行。 – Quentin

+0

@Quentin thx,我没有专注,这是写在问题!你学习每一天.. – Kaddath

回答

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);

+0

嗨昆汀,非常感谢你的答案。如果我问一个后续问题,你介意吗?我想知道作者所说的关键参数k在第一次调用中是不确定的(在哪里传入一个对象本身)''。为什么对象'a'本身作为参数传递给'匿名函数'?这种逻辑的目的是什么? – Thor

+0

我无法想象我的头顶有什么用处。 (这并不意味着没有任何。) – Quentin

+0

有时候我只是没有得到javascript如何工作大声笑。只是想知道,你碰巧知道我在哪里可以找到“JSON.stringify”方法的实现(即源代码)?想知道它是如何在内部实施的。 – Thor

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访问。