2017-01-05 2 views
1

У меня есть массив утра, как это:JavaScript бросает неопределенную ошибку при попытке перебрать вложенного JSON

var jsonObj = { 
    "name": "my boards", 
    "children": [ 
    { 
     "name": "AAA", 
     "children": [ 
     { 
      "name": "AAA_2", 
      "size": 422 
     }, 
     { 
      "name": "AAA_2", 
      "size": 422 
     }, 
     { 
      "name": "AAA_2", 
      "size": 422 
     } 
     ] 
    }, 
    { 
     "name": "BBB", 
     "children": [ 
     { 
      "name": "BBB_2", 
      "size": 422 
     }, 
     { 
      "name": "BBB_2", 
      "size": 422 
     }, 
     { 
      "name": "BBB_2", 
      "size": 422 
     } 
     ] 
    }, 
    { 
     "name": "CCC", 
     "children": [ 
     { 
      "name": "CCC_2", 
      "size": 422 
     }, 
     { 
      "name": "CCC_2", 
      "size": 422 
     }, 
     { 
      "name": "CCC_2", 
      "size": 422 
     } 
     ] 
    } 
    ] 
} 

И я хочу использовать JQuery, чтобы заполнить этот объект со значениями внутри дивы. Я думаю, что получаю точки и скобки неправильно. Я пытаюсь это:

function fill_object() { 
    $.each($('.my_div'), function() { 
    jsonObj.children["name"] = $(this.id).value(); 
    jsonObj.children.children["name"] = $(this.id).value(); 
    }); 
    return (jsonObj) 
} 

Но я получаю следующее сообщение об ошибке:

Uncaught TypeError: Cannot read property 'children' of undefined 

Я хочу, чтобы иметь возможность добавлять значения AAA, AAA_2, ВВВ, BBB_2, CCC и CCC_2

+1

jsonObj.children - это массив ... не объект – deweyredman

+0

[Нет такой вещи, как «объект JSON»] (http://benalman.com/news/2010/03/theres-no-such- thing-as-a-json /) –

+0

* «Я хочу иметь возможность добавлять значения в AAA, AAA_2, BBB, BBB_2, CCC и CCC_2» * Не уверен, что это значит. Можете ли вы представить более простой пример ввода и пример ожидаемого результата? –

ответ

1

Как вы упомянули в комментариях, что это то, что вы искали (не отвечал, поскольку я не был уверен в ваших требованиях)

Итак, вам нужны вложенные петли, такие как

for(var i = 0; i < jsonObj.children.length; i++) { 
    console.log(jsonObj.children[i].name); //outputs name 

    for(var j = 0; j < jsonObj.children[i].children.length; j++) { 
    console.log(jsonObj.children[i].children[j].name); //outputs nested children names 
    } 
} 

Здесь, я зацикливание jsonObj.children первых, а потом, я вложенность другого for цикла для перебора вложенного массива, который дополнительно имеет объекты с name в качестве ключа.

Вы можете сделать небольшую оптимизацию здесь делать что-то вроде

for(var i = 0, l = jsonObj.children.length; i < l; i++) 

Так что мы только подсчитывать length вашего array раз. Вы можете сделать то же самое для своего вложенного цикла.

+0

Отлично. Спасибо за подсказку оптимизации. – Cybernetic

Смежные вопросы