jQuery和JSON对象迭代

5

我目前正在尝试找出如何迭代JSON响应中的所有对象。我的对象可能有无穷多个子对象,它们也可能有无穷多个子对象。

{
  "obj1" : {
      "obj1.1" : "test",
      "obj1.2" : {
         "obj1.1.1" : true,
         "obj1.1.2" : "test2",
         "obj1.1.3" : {
             ... // etc
         }
      }
  }
}

我在想是否有一个开箱即用的脚本可以处理这种类型的对象?

+1 for the name and interesting question. 我认为我不会使用您正在使用的数据结构类型,因为它似乎在两端都可能很昂贵。可能有更好的解决方案,不需要遍历树。也许您可以详细说明一下您尝试对数据进行什么操作(当您找到有趣的部分时)。 - Gabriel
通常最好了解响应的一般格式。JSON 的强大之处在于可以通过键获取对象。如果您不知道键或值是什么,也不知道格式是什么,那么 JSON 可能不适合您。 - Alex
请不要在您的帖子中使用签名或标语 - user229044
5个回答

4
下面是一个小函数,它可以跟踪您在树中的遍历深度,并在沿途停留以允许您执行某个操作(您没有指定您想要做什么或何时执行)。
function dig( blob, depth ) { 
  var depth = depth || 0; // start at level zero
  for( var item in blob ) {
    console.log( 'depth: ' + depth + ': ' + item); // do something real here
    if( typeof blob[item] === 'object' ) {
      dig( blob[item], ++depth ); // descend
    } else { // simple value, leaf
      console.log( ' => ' + blob[item] ); // do something real here
    }
  }
}      

console.log( dig( obj ) );

假设obj是你的JSON,如上所示,以下内容应该会给你类似这样的结果(未经测试):
depth: 0: obj1
depth: 1: obj1.1
 => test
depth: 1: obj1.2
// etc.

2

你在问题中提到的不是JSON,而是JavaScript对象字面量。区别在于一个是字符串,另一个是实际的字面对象,可以在JavaScript中直接使用,无需进一步转换。

要遍历JS对象字面量,请使用简单的递归for循环。您不需要单独的库来完成这个操作。

var walk = function(o){
  for(var prop in o){
    if(o.hasOwnProperty(prop)){
      var val = o[prop];
      console.log('Value = ',val, ', Prop =', prop, ', Owner=',o);
      if(typeof val == 'object'){
        walk(val);
      }
    }
  }
};

walk({ 'foo':'bar', biz: { x: 'y' } });

1

一旦您将JSON解析为对象,您需要实现一个树遍历器(递归函数)来查找您感兴趣的特定值。

然而,JOrder可能会对您有很大帮助,它提供数据管理功能,这样可以避免编写树遍历器,并且可以进行良好的高效搜索和排序。

https://github.com/danstocker/jorder


0

jQuery JavaScript库刚刚拥有了这个方法:

var jsonObject = $.parseJSON('{
  "obj1" : {
      "obj1.1" : "test",
      "obj1.2" : {
         "obj1.1.1" : true,
         "obj1.1.2" : "test2",
         "obj1.1.3" : {
             ... // etc
         }
      }
  }
}');

alert(jsonObject['obj1']);

parseJSON() 方法 接受一个 JSON 字符串(通常是从 JSON 请求中获取的),并返回一个 JavaScript 对象。然后,您可以像访问任何 JavaScript 对象一样访问数据。


哦,我假设魔鬼知道如何将JSON转换成对象。 - ocodo
@Marus,也许不是这样!迭代最初的拼写是“irritating”。 - ocodo
哦...对不起,我的拼写错误了...抱歉给您带来困惑! :) - tftd

0

我正在使用这段代码片段来遍历JSON。基本上,当节点是一个对象时,我会递归调用相同的函数。希望你觉得它有用。

正如你所看到的,它需要jQuery。但也可以不使用相同的思路来完成。

function recorrer(json) {

 $.each(json, function(index, value) {


         switch ($.type(value)){

             case 'string':
                  console.log(value) //for example                     
                 break;

             case 'object':
                 recorrer(value); // recursiva                     
                break;
         }



 });

};


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接