2013-05-02 186 views
5

我有以下代码:为什么JSON.stringify()替换函数不起作用?

http://jsfiddle.net/8tAyu/7/

var foo = { 
    "foundation": "Mozilla", 
    "model": "box", 
    "week": 45, 
    "transport": { 
     "week": 3 
    }, 
    "month": 7 
}; 

console.log(JSON.stringify(foo, 
          function(k, v) { 
           if (k === "week") 
            return v; 
           else 
            return undefined; 
          })); 

所以按说,我的“周”,即没有嵌套应该回来想至少我会看到如何让一个嵌套回来吧。但是不管怎么改,console.log打印出undefined,除非我总是把功能改成return v,然后我找回整个对象。这是为什么?

+1

因为第一次调用替换器时会发送'“”'(一个空字符串),并且返回'undefined',从而有效地停止转换过程。 – 2013-05-02 01:50:00

+0

MDN文档:[替换参数](https://developer.mozilla.org/en-US/docs/Using_native_JSON#The_replacer_parameter) – 2013-05-02 01:57:40

+0

我有点奇怪,为什么最初的传球是... ...似乎我们需要“特别处理它“......如果第一次通过空键和值作为未完成的对象,那么如果我们需要第一次通过,我们总是可以做一些特殊处理......实际上,我没有看到一个原因需要第一次通过 – 2013-05-02 02:06:30

回答

4

字符串似乎被称为,首先,一个空的'k'的对象的根。我们返回undefined,并停止所有处理。

如果我们将其更改为:

if (!k || (k == "week")) 

那么结果是:

{"week":45} 

你不会得到嵌套的一个,因为我们的“运输”返回undefined而忽略其所有内容。

+0

但是如果对象'foo'具有名称为空字符串的属性,如http://jsfiddle.net/8tAyu/16/那么它也会包含它 – 2013-05-02 01:57:54

+1

@动静能量:你也应该做'v && typeof v ===“object”'。然后,如果你想要嵌套的星期,摆脱'!k'部分。 – 2013-05-02 01:59:54

+0

@squint你能给出完整的代码...或者你的意思是http://jsfiddle.net/8tAyu/27/,它不会工作... – 2013-05-02 02:10:45