2012-05-09 3 views
0

Я пытаюсь понять проблему, с которой я сталкиваюсь с JSON и перебираю объекты. Я никогда не использовал JSON раньше, поэтому, пожалуйста, дайте мне знать, если ошибки синтаксиса вызывают мои проблемы.JSON looping через вспомогательные объекты

У меня есть этот объект JSON определен:

var columnData = { 
    "obj1":{Heading: "Test 1", Required: "True", DataTypeCode:"str", DropDownOptions: "", ColumnId: "1"}, 
    "obj2":{Heading: "Test 2", Required: "False", DataTypeCode:"dropdown", DropDownOptions: "Alpha,Beta,Gamma,Delta", ColumnId: "2"}, 
    "obj3":{Heading: "Test 3", Required: "True", DataTypeCode:"int", DropDownOptions: "", ColumnId: "3"} 
}; 

И я передаю его в функцию, которая делает это:

for (var col in columnData) { 
    r += '<td><input type="text" name="col' + col.ColumnId + '" value="' + col.Heading + '" /></td>' 
} 

точек останова в FireBug подтверждает, что columnData является объект, он имеет три вспомогательных объекта, а вспомогательные объекты имеют ожидаемые свойства и значения. Но это выход я получаю после того, как функция называется:

<td><input name="colundefined" value="undefined" type="text"></td> 

К сожалению, я думаю, что мое отсутствие опыта работы с JSON делает результаты моих попыток отслеживать ответ вниз непригодным. Как написать цикл, который будет правильно получать вспомогательные объекты columnData?

+0

Hm, выглядит как объект буквально. Где JSON? –

+0

Не так ли? Наверное, я недостаточно знаю об объектах JSON и Javascript, чтобы узнать разницу. Я получил синтаксис из какого-то другого вопроса JSON. В любом случае, пока это работает, мне все равно, если это технически JSON или нет. – William

+0

Что касается JavaScript, JSON извлекается из внешнего файла '.json' (с сервера) в виде строки, которая затем анализируется с помощью' JSON.parse' в объект JavaScript. С другой стороны, когда у вас есть 'var obj = {...};', это объектный литерал и не имеет отношения к JSON. –

ответ

1

Вам все еще нужно columnData:

columnData[col].ColumnId 
+0

Спасибо, что сработали. – William

1

ли это:

var key; 
var col; 

for (key in columnData) { 
    col = columnData[ key ]; 
    r += '<td><input type="text" name="col' + col.ColumnId + '" value="' + col.Heading + '" /></td>'; 
} 

Другой вариант:

r += Object.keys(columnData).map(function (key) { 
    var col = columnData[ key ]; 
    return '<td><input type="text" name="col' + col.ColumnId + '" value="' + col.Heading + '" /></td>'; 
}).join(''); 

Я также рекомендую шаблонизатор (как Handlebars.js) для конкатенации строки HTML необходимо.

+0

Спасибо за помощь. – William

1

JSON требует, чтобы значения ключа были заключены в двойные кавычки, ваша переменная columnData является объектом javascript, а не JSON.

Это указано, col - текущий ключ в columnData, повторяющийся, например. obj1, obj2, obj3. Если вы хотите получить доступ к объекту одного из этих объектов, вам необходимо получить к нему доступ в первую очередь:

var col; 
for (var key in columnData) { 
    col = columnData[key]; 
    r += '<td><input type="text" name="col' + col.ColumnId + '" value="' + col.Heading + '" /></td>' 
} 
+0

Спасибо. Наверное, я не использую JSON? В любом случае он работает сейчас. – William

+0

@William correct, JSON и javascript объекты часто путают. JSON - это язык передачи данных, который существует как строка, в то время как объекты javascript - это хорошо, объекты javascript :) – jbabey

+0

Итак, JSON - это строка, которая может быть проанализирована объектами? Понимаю. Ты узнаешь что-то новое каждый день. – William