首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >遍历对象

遍历对象
EN

Stack Overflow用户
提问于 2013-10-11 17:12:00
回答 6查看 232.4K关注 0票数 74

我很难找到一种以我想要的方式迭代这个对象的方法。我这里只使用Javascript。

首先,这是一个对象

代码语言:javascript
复制
{
"dialog":
{
    "dialog_trunk_1":{
        "message": "This is just a JSON Test"
    },
    
    "dialog_trunk_2":{
        "message": "and a test of the second message"
    },

    "dialog_trunk_3":
    {
        "message": "This is a test of a bit longer text. Hopefully this will at the very least create 3 lines and trigger us to go on to another box. So we can test multi-box functionality, too."
    }
}
}

现在,我只是尝试一些基本的方法来理解这个对象上的每个dialog_trunk。理想情况下,我希望遍历对象,并为每个主干显示它的message值。

我尝试使用for循环来动态生成dialog_trunk的名称/编号,但是我无法使用对象名称的字符串访问对象,因此我不确定从哪里开始。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-10-11 17:14:20

为此您使用了一个for..in循环。确保检查该对象是否拥有该属性,或者是否显示了所有继承的属性。一个例子是:

代码语言:javascript
复制
var obj = {a: 1, b: 2};
for (var key in obj) {
  if (obj.hasOwnProperty(key)) {
    var val = obj[key];
    console.log(val);
  }
}

或者,如果需要递归遍历所有属性:

代码语言:javascript
复制
var obj = {a: 1, b: 2, c: {a: 1, b: 2}};
function walk(obj) {
  for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
      var val = obj[key];
      console.log(val);
      walk(val);
    }
  }
}
walk(obj);
票数 164
EN

Stack Overflow用户

发布于 2013-10-11 17:36:10

我的问题实际上是对JSON对象的错误规划问题,而不是实际的逻辑问题。我最后所做的是按照user2736012的建议,按如下方式组织对象。

代码语言:javascript
复制
{
"dialog":
{
    "trunks":[
    {
        "trunk_id" : "1",
        "message": "This is just a JSON Test"
    },
    {
        "trunk_id" : "2",
        "message": "This is a test of a bit longer text. Hopefully this will at the very least create 3 lines and trigger us to go on to another box. So we can test multi-box functionality, too."
    }
    ]
}
}

在这一点上,我能够根据对象的总数做一个相当简单的for循环。

代码语言:javascript
复制
var totalMessages = Object.keys(messages.dialog.trunks).length;

    for ( var i = 0; i < totalMessages; i++)
    {
        console.log("ID: " + messages.dialog.trunks[i].trunk_id + " Message " + messages.dialog.trunks[i].message);
    }

不过,我的获取totalMessages的方法并不是所有浏览器都支持的。对于我的项目,它实际上并不重要,但如果您选择使用类似的东西,请注意这一点。

票数 14
EN

Stack Overflow用户

发布于 2015-07-01 09:30:00

下面是我的递归方法:

代码语言:javascript
复制
function visit(object) {
    if (isIterable(object)) {
        forEachIn(object, function (accessor, child) {
            visit(child);
        });
    }
    else {
        var value = object;
        console.log(value);
    }
}

function forEachIn(iterable, functionRef) {
    for (var accessor in iterable) {
        functionRef(accessor, iterable[accessor]);
    }
}

function isIterable(element) {
    return isArray(element) || isObject(element);
}

function isArray(element) {
    return element.constructor == Array;
}

function isObject(element) {
    return element.constructor == Object;
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19323699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档