循环复杂的JSON对象

时间:2011-10-10 01:00:18

标签: javascript jquery json loops

我有一个非常复杂的json对象,我需要按原样编写所有属性和键。我有它的概念就是无法执行。

如果对象具有对象等,则需要继续调用该函数。我碰到了障碍,有些钥匙没有被输出,有些价值被打破了

0:h 1:t 2:t 3:p 4: 5:/ 6:/ etc....
name:Travel
scheme:
label:

我认为我的代码中某处需要更改一些错误。

ObjectValues = function(obj){
for(var j in obj){
   if(typeof(obj[j]) == "object"){
       for(var k in obj[j]){
         ObjectValues(obj[j][k]);
       }
   } else {
       console.log(j + ":" + obj[j]);
   }
}

_

{
"title": "Norway Tourism: Wildlife and Nature",
"author": "",
"categories": [
    {
        "name": "Travel",
        "scheme": "",
        "label": ""
    }
],
"countries": [

],
"content": [
    {
    "thumbnails": [
    {
        "audioChannels": 0,
        "audioSampleRate": 0,
        "bitrate": 0,
        "checksums": {
            "md5": "7089E4E044069AE7702DEC686"
        }
      }
    ]
   }
  ]
}

4 个答案:

答案 0 :(得分:7)

ObjectValues = function(v, k){
  if (typeof v == "object") {
    for (var kp in v) {
      if (Object.hasOwnProperty.call(v, kp)) {
        ObjectValues(v[kp], k != undefined ? k + "." + kp : kp);
      }
    }
  } else {
    console.log(k + ":" + v);
  }
};

甚至可以用于非对象的JSON值。它适用于

ObjectValues(JSON.parse("0"));
如果你ObjectValues("http://..."),它将不会被原文处理,并且不会迭代顶级字符串中的字符。

答案 1 :(得分:2)

使用:

ObjectValues = function(obj) {
    var isArray = obj instanceof Array;
    for (var j in obj) {
        if (obj.hasOwnProperty(j)) {
            if (typeof(obj[j]) == "object") {
                if(!isArray)
                {
                    console.log(j + ":");
                }
                ObjectValues(obj[j]);
            } else if(!isArray) {
                console.log(j + ":" + obj[j]);
            }
        }
    }
}

注意删除的循环。你把它拆分的方式就是丢失k名字。

您还应该使用hasOwnProperty来避免序列化不需要的密钥。

如果值是一个对象,您仍然希望序列化该键(例如,您不想丢失{foo: {} }的foo。)

最后,我必须进行数组检查,因为数组是对象,我们确实希望在数组中输出嵌套的键,但我们不希望自己输出数组索引。

jsFiddle的演示。

答案 2 :(得分:0)

不能说这是唯一的问题,但是在国家/地区阵列之后你错过了一个逗号。

此外,对于像“类别”(和其他)这样的细分市场,你确定它需要用方括号括起来吗?在JS术语中,这是一个数组。所以我相信你说你有一个数组,但在这种情况下,该数组的唯一成员是一个对象。

答案 3 :(得分:0)

因为你的问题有一个jquery标记:

我个人使用jquery.dump插件用于此目的。