JQuery "каждый" цикл с массивом JSON
Я пытаюсь использовать цикл jQuery each
, чтобы пройти через этот JSON и добавить его в div
с именем #contentHere
. JSON выглядит следующим образом:
{ "justIn": [
{ "textId": "123", "text": "Hello", "textType": "Greeting" },
{ "textId": "514", "text":"What up?", "textType": "Question" },
{ "textId": "122", "text":"Come over here", "textType": "Order" }
],
"recent": [
{ "textId": "1255", "text": "Hello", "textType": "Greeting" },
{ "textId": "6564", "text":"What up?", "textType": "Question" },
{ "textId": "0192", "text":"Come over here", "textType": "Order" }
],
"old": [
{ "textId": "5213", "text": "Hello", "textType": "Greeting" },
{ "textId": "9758", "text":"What up?", "textType": "Question" },
{ "textId": "7655", "text":"Come over here", "textType": "Order" }
]
}
Я получаю этот JSON через использование этого кода:
$.get("data.php", function(data){
})
Любые решения?
Ответы
Ответ 1
Попробуйте (непроверенный):
$.getJSON("data.php", function(data){
$.each(data.justIn, function() {
$.each(this, function(k, v) {
alert(k + ' ' + v);
});
});
$.each(data.recent, function() {
$.each(this, function(k, v) {
alert(k + ' ' + v);
});
});
$.each(data.old, function() {
$.each(this, function(k, v) {
alert(k + ' ' + v);
});
});
});
Я понял, три отдельных цикла, так как вы, вероятно, захотите относиться к каждому набору данных по-разному (justIn, recent, old). Если нет, вы можете сделать:
$.getJSON("data.php", function(data){
$.each(data, function(k, v) {
alert(k + ' ' + v);
$.each(v, function(k1, v1) {
alert(k1 + ' ' + v1);
});
});
});
Ответ 2
Краткий код, но полнофункциональный
Ниже приведено гибридное решение jQuery, которое форматирует каждую "запись" данных в элемент HTML и использует свойства данных в качестве значений атрибутов HTML.
Jquery each
запускает внутренний цикл; Мне нужен был обычный JavaScript for
во внешнем цикле, чтобы можно было получить имя свойства (вместо значения) для отображения в качестве заголовка. В зависимости от вкуса его можно изменить для немного другого поведения.
Это всего лишь 5 основных строк кода, но они отображаются на нескольких строках для отображения:
$.get("data.php", function(data){
for (var propTitle in data) {
$('<div></div>')
.addClass('heading')
.insertBefore('#contentHere')
.text(propTitle);
$(data[propTitle]).each(function(iRec, oRec) {
$('<div></div>')
.addClass(oRec.textType)
.attr('id', 'T'+oRec.textId)
.insertBefore('#contentHere')
.text(oRec.text);
});
}
});
Производит вывод
(Примечание: я изменил текстовые значения данных JSON, добавив число, чтобы убедиться, что я отображал правильные записи в правильной последовательности - во время "отладки")
<div class="heading">
justIn
</div>
<div id="T123" class="Greeting">
1Hello
</div>
<div id="T514" class="Question">
1What up?
</div>
<div id="T122" class="Order">
1Come over here
</div>
<div class="heading">
recent
</div>
<div id="T1255" class="Greeting">
2Hello
</div>
<div id="T6564" class="Question">
2What up?
</div>
<div id="T0192" class="Order">
2Come over here
</div>
<div class="heading">
old
</div>
<div id="T5213" class="Greeting">
3Hello
</div>
<div id="T9758" class="Question">
3What up?
</div>
<div id="T7655" class="Order">
3Come over here
</div>
<div id="contentHere"></div>
Применить таблицу стилей
<style>
.heading { font-size: 24px; text-decoration:underline }
.Greeting { color: green; }
.Question { color: blue; }
.Order { color: red; }
</style>
чтобы получить "красивый" набор данных
Больше информации
Данные JSON использовались следующим образом:
для каждой категории (имя ключа, под которым хранится массив):
- имя ключа используется в качестве заголовка раздела (например, justIn)
для каждого объекта в массиве:
- 'text' становится содержимым div
- textType становится классом div (подключается к таблице стилей)
- textId становится идентификатором div
- например & lt; div id = "T122" class= "Order" & gt; иди сюда & lt;/div & gt;
Ответ 3
Это работает для меня:
$.get("data.php", function(data){
var expected = ['justIn', 'recent', 'old'];
var outString = '';
$.each(expected, function(i, val){
var contentArray = data[val];
outString += '<ul><li><b>' + val + '</b>: ';
$.each(contentArray, function(i1, val2){
var textID = val2.textId;
var text = val2.text;
var textType = val2.textType;
outString += '<br />('+textID+') '+'<i>'+text+'</i> '+textType;
});
outString += '</li></ul>';
});
$('#contentHere').append(outString);
}, 'json');
Это производит этот вывод:
<div id="contentHere"><ul>
<li><b>justIn</b>:
<br />
(123) <i>Hello</i> Greeting<br>
(514) <i>What up?</i> Question<br>
(122) <i>Come over here</i> Order</li>
</ul><ul>
<li><b>recent</b>:
<br />
(1255) <i>Hello</i> Greeting<br>
(6564) <i>What up?</i> Question<br>
(0192) <i>Come over here</i> Order</li>
</ul><ul>
<li><b>old</b>:
<br />
(5213) <i>Hello</i> Greeting<br>
(9758) <i>What up?</i> Question<br>
(7655) <i>Come over here</i> Order</li>
</ul></div>
И выглядит так:
- justIn:
(123) Привет Приветствие (514) Что? Вопрос
(122) Приходите сюда Заказ
- Недавно:
(1255) Привет Приветствие (6564) Что? Вопрос
(0192) Приходите сюда Заказ
- old:
(5213) Привет Приветствие
(9758) Что? Вопрос
(7655) Приезжайте сюда Заказ
Также не забудьте установить contentType
как 'json'
Ответ 4
Мои решения на одном из моих собственных сайтов со таблицей:
$.getJSON("sections/view_numbers_update.php", function(data) {
$.each(data, function(index, objNumber) {
$('#tr_' + objNumber.intID).find("td").eq(3).html(objNumber.datLastCalled);
$('#tr_' + objNumber.intID).find("td").eq(4).html(objNumber.strStatus);
$('#tr_' + objNumber.intID).find("td").eq(5).html(objNumber.intDuration);
$('#tr_' + objNumber.intID).find("td").eq(6).html(objNumber.blnWasHuman);
});
});
sections/view_numbers_update.php Возвращает что-то вроде:
[{"intID":"19","datLastCalled":"Thu, 10 Jan 13 08:52:20 +0000","strStatus":"Completed","intDuration":"0:04 secs","blnWasHuman":"Yes","datModified":1357807940},
{"intID":"22","datLastCalled":"Thu, 10 Jan 13 08:54:43 +0000","strStatus":"Completed","intDuration":"0:00 secs","blnWasHuman":"Yes","datModified":1357808079}]
Таблица HTML:
<table id="table_numbers">
<tr>
<th>[...]</th>
<th>[...]</th>
<th>[...]</th>
<th>Last Call</th>
<th>Status</th>
<th>Duration</th>
<th>Human?</th>
<th>[...]</th>
</tr>
<tr id="tr_123456">
[...]
</tr>
</table>
Это по сути дает каждой строке уникальный id, предшествующий "tr_", чтобы разрешить другие идентификаторы нумерованных элементов на сервере script времени. JQuery script затем просто получает этот элемент TR_ [id] и заполняет правильную проиндексированную ячейку возвратом json.
Преимущество состоит в том, что вы можете получить полный массив из БД и либо foreach ($ array as $record), чтобы создать таблицу html, OR (если есть запрос на обновление), вы можете умереть (json_encode ($ array) ) перед отображением таблицы, все на той же странице, но тот же отображаемый код.