У меня есть динамически созданная таблица HTML, которая должна быть заполнена пользователем. Пользователь может создать новый РАЗДЕЛ (столько, сколько он хочет), и он может создать LABELS и его ПЕРЕВОДЫ. Столько, сколько он хочет. Ниже приводится часть HTML-код:Как сгенерировать JSON динамически с динамическими свойствами?
<table>
<tr class = "section">
<td class = "sectionName">section1</td>;
<td><input type="submit" value="Update"></td>
</tr>
<tr class="lbl_trans_Wrap">
<td class="lbl">lbl_11</td>
<td class="trans"><input type="text" value="trans_11"></td>
</tr>
<tr class = "section">
<td class = "sectionName">section2</td>;
<td><input type="submit" value="Update"></td>
</tr>
<tr class="lbl_trans_Wrap">
<td class="lbl">lbl_21</td>
<td class="trans"><input type="text" value="trans_21"></td>
</tr>
<tr class="lbl_trans_Wrap">
<td class="lbl">lbl_22</td>
<td class="trans"><input type="text" value="trans_22"></td>
</tr>
...
</table>
Чем я хотел бы создать JSON из значений, заполненных пользователем. Объект должен быть, как этот:
var lang =
{
section1:
{
lbl_11:"trans_11"
},
section2:
{
lbl_21:"trans_21",
lbl_22:"trans_22"
}
};
Сформировать выше JSON Я использую следующий JavaScript:
var lang ={};
var lbl="";
var trans="";
var section="";
$("tr").each(function() {//Pass trough each line in the table
if($(this).hasClass("section")){
section = $(this).children("td.sectionName").html();//Grab all sections
//console.log(section);
}
if($(this).hasClass("lbl_trans_Wrap")){
lbl = $(this).children("td.lbl").html();//Grab all labels
//console.log(lbl);
trans = $(this).children("td.trans").children("input.txt_translate").val();//Grab all translation
//console.log(trans);
lang[section]={lbl:trans};
}
});
//console.log(lang);
Но JSON не создается, как и ожидалось.
Есть 2 вопроса здесь:
- языки [раздел] = {LBL: транс} является перекрывая последний. Поэтому в конце процесса мы имеем только последний один элемент.
- Переменная переменной lbl не распознается как переменная, а как строка.
выглядит так:
var lang =
{
section1:
{
lbl:"trans_11"
},
section2:
{
lbl:"trans_21"
}
};
Я попытался предложения от этого post и этого one. Но они не используют динамически созданный property. Я пытался использовать push, но он не работает с объектами. Я мог бы создать строку JSON, а затем до parse. Но я хотел бы знать, как решить эту проблему по-другому. Любая идея в том, как генерировать этот JSON динамически?
UPDATE:
После поста Джеймса, это код, который работает:
$("tr").each(function() {//Pass trough each line in the table
if($(this).hasClass("section")){
section = $(this).children("td.sectionName").children("h1").html();//Grab all sections
//console.log(section);
}
if($(this).hasClass("lbl_trans_Wrap")){
lbl = $(this).children("td.lbl").html();//Grab all labels
//console.log(lbl);
trans = $(this).children("td.trans").children("input.txt_translate").val();//Grab all translation
//console.log(trans);
if (!lang[section]) {
lang[section] = {};
}
lang[section][lbl] = trans;
}
});
//console.log(lang);
Есть ли причина, что вы не используете фактические поля формы? Вы могли бы довольно легко использовать что-то вроде [serializeArray] (http://stackoverflow.com/questions/1184624/convert-form-data-to-javascript-object-with-jquery) – Will
Привет друг, 2 причины: 1- Иногда мы должны сделать выбор. В этом случае у меня нет выбора. Я работаю над проектом, который не был написан моей рукой.Поэтому, если я решу переписать с нуля, это будет долгий путь. Вот почему я решил продолжить код. 2- Я предпочитаю узнать, чего не знаю. Теперь я знаю, как создать JSON полностью динамично, благодаря Джеймсу. – zwitterion