javascript - 循环遍历键值是数组的对象(其值是对象)

标签 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”时,对吧?

这些似乎都不起作用,或者总是抛出错误(当前无法读取未定义的属性“长度”),所以我非常感谢您的帮助。

最佳答案

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

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

尽管如此,您永远不能使用点语法将数值用作键。对于带有数字键的数组和对象(从技术上讲,JS 数组是对象,所以这种区别非常精细......),你永远不能这样做 obj.2arr.0 ,您使用括号语法: obj[2]arr[0] .

提示:当您试图弄清楚如何对这种深度嵌套的对象进行切片和切 block 时,使用 JavaScript 控制台确实很有帮助。您可以复制帖子顶部的 JSON 数据 open your JS console ,输入var data = <PASTE> 。这是有效的,因为 JSON 代表“JavaScript 对象表示法”并且是有效的 JavaScript!然后,您可以输入data.comments.2并发现这是一个语法错误,与 data.comments.'2' 类似。 。但是data.comments[2]给你两个对象,然后你可以运行 data.comments[2].map(function(val, idx) {return val.comment})确保您掌握了语法。

(如果您经常使用 JS 对象、数组和数据,我推荐 lodash 或类似的项目,如 RamdaTrine 。)

关于javascript - 循环遍历键值是数组的对象(其值是对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30797380/

相关文章:

jquery - MVC3 jQuery - 部分验证

javascript - jQuery 在其子元素上发生 mousedown 事件时拖动元素

c - 将输入的数据存储在数组中

javascript - 在 HTML 中动态向表添加行

javascript - 如何像jquery中的触发器('click'一样触发knockout.js中的点击事件?

javascript - Canvas 尺寸的奇怪行为

php - 如何从 Mysql 中选择逗号分隔的变量

javascript - 无法使用异步方法将数组传递给 View

javascript - 在另一个自定义标签内动态创建 polymer 元素

javascript - 使用 jQuery 获取所选选项的值