迭代通过JSON对象的JavaScript

我正在尝试以我想要的方式find一种方法来遍历这个JSON对象。 我在这里只使用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的名称/编号,但我不能访问使用对象名string的对象,所以我不知道该从哪里去。

你使用for..in循环。 一定要检查对象是否拥有属性或所有的inheritance属性。 一个例子是这样的:

 var obj = {a: 1, b: 2}; for (var key in obj) { if (obj.hasOwnProperty(key)) { var val = obj[key]; console.log(val); } } 

或者如果你需要recursion遍历所有的属性:

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

我的问题实际上是一个与JSON对象计划不好的问题,而不是一个实际的逻辑问题。 我最终做的是按照user2736012的build议来组织对象。

 { "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." } ] } } 

那时候,我可以根据对象的总数做一个相当简单的循环。

 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的方法在所有浏览器中都不被支持。 对于我的项目,实际上并不重要,但要小心,如果你select使用类似的东西。

这是我的recursion方法:

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