Доступ к вложенным массивам в JSON с помощью jQuery - PullRequest
1 голос
/ 28 марта 2011

Я уверен, что это простая проблема, поэтому заранее извиняюсь за то, что даже спросил об этом.В приведенном ниже коде я конвертирую RSS-канал в JSON с помощью плагина jGFeed.В этом JSON мне нужно получить доступ к узлу URL, который вложен в несколько уровней в пределах вложенного массива.Прямо сейчас я могу использовать "console.log (" feeds.entries [i] ")", чтобы получить некоторые атрибуты каждого объекта на родительском уровне (т. Е. "Title", "content" и т. Д.).Я просто не могу понять, как развернуть вложенный массив.

Это мой код:

$(document).ready(function() {

    $.jGFeed('http://feeds.feedburner.com/solidverbal/app', function(feeds){
        // Check for errors
        if(!feeds){
        // there was an error
        return false;
        }
        var sAnchors = "<ul>";
        //var wantedFeed = "";
        for(var i=0; i<feeds.entries.length; i++){
            console.log(feeds.entries[i]); 
            var sAnchors = sAnchors + "<li><a href=\"#link\" id=\"title_" + i + "\" class=\"giveFeeds\">" + feeds.entries[i].title + "</a></li>";
        }
        sAnchors = sAnchors + '</ul>';

        //Append the <a>.
        $('#titles').append(sAnchors);

        //When the user clicks on the giveFeeds link....
        $('.giveFeeds').live('click', function(e) {

            //Get the feed number
            var tmpId = $(e.target).attr("id");

            //Returns the value after the '_' char and make sure it returns de number.
            var id = parseInt(tmpId.split("_")[1]);

            //Use the id value to get the desired feed
            var wantedFeed = feeds.entries[id].content;

            //Then do whatever you want with that entry
            $("#content").html(wantedFeed);
        });


    }, 20);
});

Вот пример структуры JSON, как она появляется в Chromeconsole:

Object
     author: "Test"
     categories: Array[10]
     content: "<p></p><p>Test Content"
     contentSnippet: "Test Content Snippet"
     link: "http://www.solidverbal.com/2011/03/24/charles-robinson-324/"
     mediaGroups: Array[1]
          0: Object
               contents: Array[1]
                    0: Object
                         fileSize: "12796261"
                         type: "audio/mpeg"
                         url: "http://www.testurl/test.mp3"

Любая помощь будет принята с благодарностью.Я думаю, что это вложенный цикл for или что-то еще, но по какой-то причине я просто не могу его получить.

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 28 марта 2011

Если вы хотите повторить каждый элемент, jQuery $.each() может помочь вам достичь вашей цели.

$.each(feed.mediaGroups, function(x, mediaGroup) {

    $.each(mediaGroup, function(y, contents) {

        $.each(contents, function(z, content){
            alert(content.fileSize);
        });
    });
});

Пример кода на jsfiddle .

1 голос
/ 28 марта 2011

Это как навигация по графу объектов в Java или C #, вы можете сделать feeds.entries[0].link, чтобы получить URL или feeds.entries[0].mediaGroups[0].contents[0].fileSize

for (var i = 0; i < feeds.entries.length; i++) {
    var entry = feeds.entries[i];
    for (var j = 0; j < entry.mediaGroups.length; j++) {
        var mediaGroup = entry.mediaGroup[j];
        for (var k = 0; k < mediaGroup.contents.length; k++) {
            var content = mediaGroup.contents[k];
            // do something with content.url.
        }
    }
}
...