为什么JSON.stringify()在传递replacer函数时返回undefined?

时间:2014-07-17 16:58:24

标签: javascript json

当我将函数作为第二个参数传递给JSON.stringify()并测试键的值时,我得到了未定义。知道为什么吗?

var person = {
    name: "Siddharth",
    age: 23,
    sex: 0,
    phone: 12345
};

personString = JSON.stringify(person, personFilter, 2);
console.log(personString);

function personFilter(key, value) {
    if (key == "age") {
        return value;
    }
}

fiddle

1 个答案:

答案 0 :(得分:3)

如果您只想获得“年龄”,则可以使用数组而不是函数:

personString = JSON.stringify(person, ["age"], 2);

If you use a function, it is getting the whole object first

  

replacer参数可以是函数,也可以是数组。作为一个函数,它需要两个参数,键和值被字符串化。找到密钥的对象作为replacer的this参数提供。 最初使用表示要进行字符串化的对象的空键调用,然后为要进行字符串化的对象或数组上的每个属性调用它。它应该返回应该添加到JSON字符串的值,如下所示:

     
      
  • 如果返回Number,则将与该数字对应的字符串用作添加到JSON字符串时的属性值。   如果返回String,则在将该字符串添加到JSON字符串时,该字符串将用作属性的值。

  •   
  • 如果返回布尔值,则在将其添加到JSON字符串时,将“true”或“false”用作属性的值。

  •   
  • 如果返回任何其他对象,则会以递归方式将对象字符串化为JSON字符串,并在每个属性上调用replacer函数,除非该对象是函数,在这种情况下,不会向JSON字符串添加任何内容。 / p>

  •   
  • 如果返回undefined,则该属性不包含在输出JSON字符串中。
  •   

至于为什么整个对象的键是空的...它确实是唯一的选项 - 其他任何东西都可以是对象属性的键,空键是只有他们可以使用的东西,你可以知道 - 在变换器函数内 - “这绝对是整个对象”,无论对象包含什么。

所以在你的情况下,它看起来像:

personString = JSON.stringify(person, personFilter, 2);

function personFilter(key, value) {
    if (key == "age" || key == "") {
        return value;
    }
}