循环访问其键值为数组(其值为对象)的对象

时间:2015-06-12 07:15:41

标签: javascript jquery arrays json

不幸的是我的问题昨天已经结束了 - 我读完了他的回答,但我还是被困住了。我已经对它有了更多的了解,但似乎无法做到这一点。我有一些疯狂的多维疯狂,它让我感到困惑!

fresh_posts.php:

{ 
    "posts":{
        "5": {
            "id":"5",
            "image":"link.jpg",
            "submitter":"4322309",
            "views":"3"
        },
        "2": {
            "id":"2",
            "image":"link.jpg",
            "submitter":"4322309",
            "views":"5"
        }
    },

    "comments":{
        "2": [{
            "id":"1",
            "submitter":"submitter",
            "time":"2435657",
            "comment":"comment",
            "score":"10",
            "postid":"2"
        },
        {
            "id":"2",
            "submitter":"submitter",
            "time":"2435657",
            "comment":"comment",
            "score":"10",
            "postid":"2"
        }
    ],
        "5": [{
            "id":"3",
            "submitter":"submitter",
            "time":"2435657",
            "comment":"comment",
            "score":"10",
            "postid":"5"
        }]
    }
}

最初,我这样做:

$.getJSON('fresh_posts.php',function(data){
    global_save_json = data.comments; // saves comments object for later use
    ... 
})

然后我在点击功能中使用它(getJSON之外)。

$('.main').on('click','.new-comments',function(e){

    var fullid = e.target.id;
    var subid = fullid.substring(8); // subid = the number of string e.g. "show-all88" from fullid becomes "88" from subid.

    function appendAllComments(input){

        $.each(global_save_json.input,function(index,value){
            for (var key in value) {
                if (value.hasOwnProperty(key)) {
                    console.log(key + " -> " + value[key]);
                }
            }
        })

    }

    appendAllComments(subid);

})

•假设我们发送输入2(在上面的示例JSON对象中),我需要循环遍历该数组(包含对象的该数组的每个值)。所以我们做(?):

$.each(global_save_json.2,function(index,value){

或者是

$.each(global_save_json."2",function(index,value){

^我们循环遍历数组中的每个值(?)

•然后,对于每个对象(每个数组的值都是对象):

for (var key in value) {
    if (value.hasOwnProperty(key)) {
        console.log(key + " -> " + value[key]);
    }
}

从上面的$.each()循环中,我们将数组值定义为" value",所以现在当我们循环对象" value"时,对吗?

这些似乎都不起作用,或一直抛出错误(目前为cannot read property 'length' of undefined),所以我感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

好吧,很高兴你明白了,这是我的正式答案:

obj.key语法相当于obj['key'],如果您要编制索引的键是文字的,则非常有用。但是当您想以编程方式查找密钥时,后一种语法是您可以使用的唯一语法,因为您可以执行var input = 2; obj[input]。 (在JavaScript中,所有键都是字符串,因此无论input = 2还是input = '2'都无关紧要,当运行时看到obj[input]时,它会强制{{1} } to string。)没有办法将点语法与存储键名的变量一起使用。

尽管如此,你永远不能将数值用作点语法的键。对于具有数字键的数组和对象(从技术上讲,JS数组是对象,因此这种区别是超精细...),您不能inputobj.2使用括号语法:{{ 1}}或arr.0

只是一个提示:当你试图弄清楚如何切割和切割这种深层嵌套的对象时,使用JavaScript控制台真的很有帮助。您可以在帖子顶部open your JS console复制JSON数据,输入obj[2]。这是有效的,因为JSON代表&#34; JavaScript Object Notation&#34;并且是有效的JavaScript!然后,您可以输入arr[0]并查看它是语法错误,与var data = <PASTE>类似。但data.comments.2为您提供了两个对象,因此您可以运行data.comments.'2'以确保获得语法。

(如果您对JS对象,数组和数据做了很多工作,我建议lodash或类似RamdaTrine等项目。)

答案 1 :(得分:0)

你需要去两次

for (var key in obj) {
    //Get posts and comments
    var objectsInner = obj[key];

    for (var key2 in objectsInner) {
        //This is arrays in posts and comments
        // key2 has values '2' and '5', and inside these objects you have an array
        var arrays = objectsInner[key2];
    }
}

您可以创建一个函数来根据输入检索所有数据(&#39; 2&#39;) 看看这个小提琴http://jsfiddle.net/Ldk9spne/

答案 2 :(得分:0)

这样的事情:

var posts = data.posts;
var comments = data.comments;

// Cycle for posts
for(var id in posts) {
    // Get comments for post
    if (comments[id] !== undefined) {
        comments[id].forEach(function(c){
            console.log('Comment '+ c.id +' for post ' + id +', made by '+ c.submitter +': ' + c.comment);
        });
    }
}

示例:http://jsbin.com/pacuqetita/1/edit?js,console

答案 3 :(得分:0)

为什么不能以不同的方式对帖子和评论进行处理,因为两者的数据不同。请尝试这样的事情

&#13;
&#13;
$.each(data,function(key, postsOrComments){
	if (key == 'posts') {
		$.each(postsOrComments, function(index, post) { 
			console.log(post);
		});
	} else if (key == 'comments') {
		$.each(postsOrComments, function(index, comments) { 
			$.each(comments, function(index, comment) { 
				console.log(comment);
			});
		});
	}
});``
&#13;
&#13;
&#13;

数据变量必须是你的ajax输出。