0

i am trying to iterate a json object (in javascript) but it doesn't seem to work correctly... it's very confusing for me to write a recursiv function, so maybe one of the experts here could help me :)

The json Object:

{
  "Node": [
    {
      "Name": {
        "#text": "Folder"
      }
    },
    {
      "Name": {
        "#text": "Folder 2"
      }
    },
    {
      "Name": {
        "#text": "Folder 3"
      },
      "Nodes": {
        "Node": {
          "Name": {
            "#text": "Folder 3.1"
          },
          "Nodes": {
            "Node": [
              {
                "Name": {
                  "#text": "Folder 3.1.1"
                },
                "Nodes": {
                  "Node": {
                    "Name": {
                      "#text": "Folder 3.1.1.1"
                    }
                  }
                }
              },
              {
                "Name": {
                  "#text": "Test 2"
                }
              }
            ]
          }
        }
      }
    },
    {
      "Name": {
        "#text": "Folder 4"
      }
    }
  ]
}

My try to solve the problem

function newFolder(_data) {    
    for (var i = 0; i < _data.length; i++) {      
        if (_data[i].Nodes) {        
            Ti.API.info("Sub: "); //+ _data[i].Nodes.Node.length );
                    
            return newFolder(_data[i].Nodes.Node);      
        } else {        
            Ti.API.info("Main: " + _data[i].Name["#text"]);      
        }      
        Ti.API.info("Main: " + _data[i].Name["#text"]);    
    }  
}

The problem is, that the functions does not run through each element, like i want to.

i've read something about jQuery each but i'm not very familar with that. plus i am using Titanium and i don't know exactly if i can use jquery.

it would be soo awesome if someone can help me out of this :)

Lee Taylor
  • 7,761
  • 16
  • 33
  • 49
Nico Barelmann
  • 21
  • 1
  • 1
  • 3
  • 2
    Why have you commented out your code?! – Lee Taylor May 15 '13 at 12:50
  • Its commented out for one. I am going to assume that is a typo. Once you parse the JSON with `JSON.parse`, you can loop through it. Now, depending on what it is, is how you will loop. If you the JSON is an array of objects, then you can iterate over it using the traditional for loop. However, if it is an object and you are trying to iterate over the properties of the object, you will have to use the `for...in` loop combined with the `obj.hasOwnProperty` check. – Jeff Shaver May 15 '13 at 12:53
  • There's [no such thing as a JSON object](http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/). – nnnnnn May 15 '13 at 12:54
  • Hey thanks so far - my goal is to get an array containing all folders and their subfolders. But even the for in just loops through the first "layer" doesn't it? – Nico Barelmann May 15 '13 at 12:57
  • Your `OBJECT` is very bad. Can we changed it to a better one? –  May 15 '13 at 13:06

3 Answers3

4

Working FIDDLE Demo

I think that your JSON is very complex as there is no need. If you have an object like this:

var data = {
    "nodes": [
        { "name": "Folder 1" },
        { "name": "Folder 2" },
        { "name": "Folder 3" },
        {
            "name": "Folder 4",
            "nodes": [
                { "name": "Folder 4.1" },
                {
                    "name": "Folder 4.2",
                    "nodes": [
                        { "name": "Folder 4.2.1" },
                        { "name": "Folder 4.2.2" },
                        { "name": "Folder 4.2.3" }
                    ]
                },
                { "name": "Folder 4.3" }
            ]
        },
        { "name": "Folder 5" }
    ]

};

You can iterate over it by a recursive function:

function iterateNodes(data) {
    for (var i = 0, l = data.nodes.length; i < l; i++) {
        var node = data.nodes[i];

        console.log(node.name);

        if (node.nodes) {
            arguments.callee(node);
        }
    }
}

iterateNodes(data);

Check the FIDDLE Demo.

  • thanks for that - seems great. But i can't really modify my json cause it's coming from a server. and i don't know why but i cant get your example run correctly with the original json :& – Nico Barelmann May 15 '13 at 13:57
  • I've tried another things but i can't reach my goal: an array containing objects of folders. each folder does have a child variable, where his child folders are saved. the child property of course is an array, too... and so on ... The background is, that i can than save the current folder in a variable and acces the childs very easily and display them. But i really have no idea how to achieve this :/ If i have to, i would even pay a few bucks for the real answer cause it's very important to me, to handle this stuff and know how to do this kind of thing:/ – Nico Barelmann May 18 '13 at 10:19
  • @NicoBarelmann My object structure is the same as you said, isn't it? –  May 18 '13 at 10:22
  • hmm there is a little difference, i think. i know it's complicated, but i can't change it to a "slighter" one :/ It's like so: { "Node": [ { "Name": { "#text": "Folder" } }, { "Name": { "#text": "Folder 2" } My main Problem is to create the right objects. My current Try: http://pastebin.com/dFFYQF38 – Nico Barelmann May 18 '13 at 10:42
0

There is no thing as a JSON object. JSON is a way to format data. You are trying to go through an ordinary javascript object. You can look how in the first answer here

Community
  • 1
  • 1
0

JSON is multi array , we can use data[a][b]... to get it. enter image description here

function xmlhttprequest(url) {
 var xhr = new XMLHttpRequest();
 xhr.onreadystatechange = function() {
  if (xhr.readyState == 4) {
   if (xhr.status == 200) {
    var data = JSON.parse(xhr.responseText);
    console.log(data);
    for(var a in data){
     document.write(a+':<br>');
     for(var b in data[a]){
      document.write('&nbsp;&nbsp;&nbsp;'+b+':<br>');
      for(var c in data[a][b]){
       document.write('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'+c+"="+data[a][b][c]+'<br>');
      }
     }
     document.write('<br>');
    }           
   }else{
    alert(url+'\n错误');
   }
  }
 }
 xhr.open('GET', url, false);
 xhr.send();
};
xmlhttprequest('https://api.shuax.com/tools/getchrome/json');
sonichy
  • 1,370
  • 2
  • 14
  • 17