Hello unity3d!

遍历 JSON JavaScript 对象树中的所有节点

 

我想要遍历 JSON 对象树中,但为何找不到任何一间图书馆。这似乎是不难,但感觉就像重新发明轮子。

在 XML 中有很多教程演示如何遍历 XML DOM 树:(


解决方法 1: 

如果你认为 jQuery 是什么样的
overkill
这种原始的任务,你可以这样做:

 1 //your object
 2 var o = { 
 3     foo:"bar",
 4     arr:[1,2,3],
 5     subo: {
 6         foo2:"bar2"
 7     }
 8 };
 9 
10 //called with every property and it's value
11 function process(key,value) {
12     log(key + " : "+value);
13 }
14 
15 function traverse(o,func) {
16     for (i in o) {
17         func.apply(this,[i,o[i]]);    
18         if (typeof(o[i])=="object") {
19             //going on step down in the object tree!!
20             traverse(o[i],func);
21         }
22 }
23 
24 //that's all... no magic, no bloated framework
25 traverse(o,process);

 


解决方法 2: 

JSON 对象是简单 Javascript 对象。这实际上是 JSON 的主张: JavaScript 对象表示法。所以你会遍历 JSON 对象,但是你会选择"穿越"Javascript 对象一般。

Jquery,我会像做

$.each(myJsonObj, function(key,val){
    // do something with key and val
});

  

您始终可以编写一个函数以递归方式下降到的对象:


function traverse(jsonObj) {
    if( typeof jsonObj == "object" ) {
        $.each(jsonObj, function(k,v) {
            // k is either an array index or object key
            traverse(v);
        }
    }
    else {
        // jsonOb is a number or string
    }
}

  

这应该是一个好的起点。我强烈建议使用 jQuery 这样的事情,因为他们的实用程序,如在每个循环使编写这样的代码要容易得多。


解决方法 3: 

那里是遍历 JSON 数据支持许多不同的使用情况下的 javascript 的新图书馆。

http://github.com/substack/js-traverse

它适用于所有种类的 JavaScript 对象。它甚至会检测周期。

它也提供了每个节点的路径。


解决方法 4: 

取决于你想做什么。下面是一个示例的遍历 JavaScript 对象树、 打印键和值的它:

function js_traverse(o) {
    var type = typeof o 
    if (type == "object") {
        for (var key in o) {
            print("key: ", key)
            js_traverse(o[key])
        }
    } else {
        print(o)
    }
}

js> foobar = {foo: "bar", baz: "quux", zot: [1, 2, 3, {some: "hash"}]}
[object Object]
js> js_traverse(foobar)                 
key:  foo
bar
key:  baz
quux
key:  zot
key:  0
1
key:  1
2
key:  2
3
key:  3
key:  some
hash

  


解决方法 5: 

有缺少} 在上面的导线函数。更正后的版本:

函数 traverse(o,func) {为 (i 在澳) {func.apply(this,[i,o[i]]) ;
如果 (typeof(o[i])=="object") {//going 在对象树中向下一步 !!traverse(o[i],func) ;} } }

posted @ 2014-11-11 02:49  子非鱼`  阅读(5595)  评论(0编辑  收藏  举报
;