2013-10-11 4 views
29

Мне очень сложно найти способ перебора этого объекта JSON так, как хотелось бы. Я использую только Javascript здесь.Итерирование через 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 на лету, но я не могу получить доступ к объекту, используя строку для имени объекта, поэтому я не уверен, куда идти Вот.

+0

Вам нужен цикл for..in – bfavaretto

+1

возможного дубликат [Access/процесс (вложенные) объекты, массивы или JSON] (http://stackoverflow.com/ вопросы/11922383/access-process-nested-objects-arrays-or-json) – bfavaretto

+1

Если возможно, вы должны изменить свою структуру, чтобы использовать упорядоченный список. Существует мало смысла использовать именованный ключ с индексом увеличения. '{" dialog ": {" trunks ": [{" message ":" ... "}, {" message ":" ... "}]}}' – user2736012

ответ

80

Для этого используется контур for..in. Не забудьте проверить, принадлежит ли объект свойствам или все унаследованные свойства. Пример такой:

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

Или, если вам нужна рекурсия, чтобы пройти через все свойства:

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

'for..in' в спецификации ECMAScript 1.0. Даже Internet Explorer 5 поддерживает его. (Источник: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in) –

9

Моей проблема была на самом деле проблемой плохого планирования с объектом JSON, а не фактической логикой вопрос. То, что я закончил, - это организовать объект следующим образом, по предложению пользователя2736012.

{ 
"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 не поддерживается во всех браузерах. Для моего проекта это на самом деле не имеет значения, но будьте осторожны, если вы решите использовать что-то похожее на это.

2

Вот мой рекурсивный подход:

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; 
} 
Смежные вопросы