Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 循环通过其键为';s值是数组(其值是对象)_Javascript_Jquery_Arrays_Json - Fatal编程技术网

Javascript 循环通过其键为';s值是数组(其值是对象)

Javascript 循环通过其键为';s值是数组(其值是对象),javascript,jquery,arrays,json,Javascript,Jquery,Arrays,Json,不幸的是,我的问题昨天就结束了——我通读了他的答案,但我还是被卡住了。关于这件事,我学到了一些东西,但似乎做得不对。我有一些疯狂的多维疯狂正在进行,这让我很困惑 fresh_posts.php: { "posts":{ "5": { "id":"5", "image":"link.jpg", "submitter":"4322309", "views":"3"

不幸的是,我的问题昨天就结束了——我通读了他的答案,但我还是被卡住了。关于这件事,我学到了一些东西,但似乎做得不对。我有一些疯狂的多维疯狂正在进行,这让我很困惑

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
    ... 
})
随后,我在click函数中使用它(在
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()
循环中,我们将数组值定义为“值”,所以现在当我们循环对象“值”时,对吗


所有这些似乎都不起作用,或者一直抛出错误(当前
无法读取未定义的属性'length',
),因此我非常感谢您的帮助。

您需要重复两次

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];
    }
}
您可以创建一个函数,根据输入('2')检索所有数据 看看这把小提琴

像这样的东西:

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);
        });
    }
}

示例:

为什么不能区别对待帖子和评论,因为它们在数据上是不同的。请尝尝这样的

$。每个(数据、函数(键、postsOrComments){
如果(键=='posts'){
$.each(postsOrComments,function(index,post){
控制台日志(post);
});
}else if(键=='comments'){
$.each(postsOrComments,函数(index,comments){
$.each(注释,函数(索引,注释){
console.log(注释);
});
});
}

});``好吧,很高兴你找到了答案,这是我的正式答案:

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

尽管如此,您永远不能使用数字值作为点语法的键。对于带有数字键的数组和对象(从技术上讲,JS数组是对象,因此这种区别是超精细的…),您永远无法执行
obj.2
arr.0
,您使用括号语法:
obj[2]
arr[0]

提示:当您试图弄清楚如何分割这种深度嵌套的对象时,使用JavaScript控制台非常有帮助。您可以复制文章顶部的JSON数据,输入
var data=
。这是因为JSON代表“JavaScript对象表示法”,是有效的JavaScript!然后,您可以键入
data.comments.2
并查看这是一个语法错误,类似地,
data.comments.2'
。但是
data.comments[2]
提供了两个对象,因此您可以运行
data.comments[2].map(函数(val,idx){return val.comment})
,以确保获得语法


(如果您经常使用JS对象、数组和数据,我建议您使用类似的项目,如和。)

要获得与Post2相关的评论,您可以使用
global\u save\u json['2']
(引号是可选的)。你试过的两种语法都没有。然后,在
var key-in-value
上循环的函数应该记录每个注释对象的所有key-val对。是否在
global\u save\u json中定义了
input
?Good catch@guest271314。在
$.each(global\u save\u json.input,
)中,您可能不希望看到
.input
,因为
global\u save\u json
数据.comments
数组。@Ahmed,哇,这似乎完全解决了这个问题,只需执行
global\u save\u json[input]
我现在已经解决了,艾哈迈德在上面的评论中提供了最简单的解决方案,使用了
global\u save\u json[input]
而不是
global\u save\u json.input
-虽然我不知道为什么这样做?无论如何,我最终不需要对象的for循环,而只需要第一个
$。每个
循环都可以完成我想要的。
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];
    }
}
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);
        });
    }
}