Сколько объектов/массивов содержит JSON
Привет бравым программистам!
чисто теоритический вопрос, не могу въехать... Как узнать сколько объектов либо массивов пришло в строке JSON. Зачем мне это надо: допустим имеется БД вида: № Имя пол возраст 1 Саша муж 5 2 Олег муж 6 3 Женя жен 5 Этих строк более 2000 есть PHP, забирающий эти данные из базы (допустим забрал 10 записей) помещает это в $result, -> далее конвертим в JSON (весь массив), отправлем клиенту На клиенте JavaScript формирует таблицу примерно таким макаром (код старый, возможно не рабочий, не в этом суть) function showList(nnn){ var table = window.document.createElement('table'); table.setAttribute ('id',list) for (i=0; i<=nnn.length-1; i++){ j = i++; var row = table.insertRow(-1); var cell = row.insertCell(-1); var cell1 = row.insertCell(0); cell.innerHTML = "<font size='3' color='blue' >" + nnn[i]+ "</font>" ; cell1.innerHTML = "<p align='right'><font size='5' color='#463C46' >" + nnn[j]+ "</font></p>" ; } document.body.appendChild(table); } данной функцией я могу воспользоваться только если рассматриваю массив, чем JSON по сути не является, но зная количество пришедших объектов, я могу его парсить в подобном цикле, кроме того количество пришедших объектов мне бы сильно пригодилось в другом. может есть какая то функция, которая сразу может сказать сколько пар ключ-значение есть в пришедшем JSON? или только фигачить с помощью "each"? ну а если я толчу воду в ступе и есть более клёвые решения - подскажите! |
Вообще, с объектом, особенно если вы знаете его структуру, удобно работать через for(key in obj){}. Эта конструкция для того и нужна.
А чтобы узнать длину JSON-объекта (в строке), при условии, что она верно сформирована, навскидку можно так:
r = "{d:err, g:sff, a:dfsf}";
alert(r.split(":").length - 1)
Нужно учитывать, что, если будут вложенные объекты, двоеточия в значениях или ключах, считать будет неверно. Но, если структура и содержание объекта известны, то как вариант на скорую руку подойдёт. А вообще, проще добавлять размер при формировании JSON. Например добавить в объект ключ length с соответсвующим значением. |
А так будет ошибка:)
r = "{'d':'err', 'g':'sf:f', 'a':'dfsf'}";
alert(r.split(":").length - 1)
|
Думаем логически.
Имеем базу следующего вида: Цитата:
Каждая строка в базе представляет ссобой объект с определенными свойствами:
{"name": "Саша",
"sex": 1, // 1 - мужчина, 0 - женщина
"old": 5
}
Совокупность объектов с идентичными свойствами является не что иное как массив. Поэтому база в JSON-формате будет выглядеть вот так:
[{"name": "Саша",
"sex": 1,
"old": 5
},
{"name": "Олег",
"sex": 1,
"old": 6
},
{"name": "Женя",
"sex": 0,
"old": 5
}]
Ну и теперь несложно узнать сколько объектов содержится в базе:
data = [{"name": "Саша",
"sex": 1,
"old": 5
},
{"name": "Олег",
"sex": 1,
"old": 6
},
{"name": "Женя",
"sex": 0,
"old": 5
}];
alert('Количество объектов в базе: ' + data.length);
alert('Имя 2-го учасника: ' + data[1].name);
|
Skipp,
Цитата:
Цитата:
Цитата:
|
Можно конечно примерно так, но это тоже не выход! Лучше конечно с массивом.
Object.prototype.length = function(){var x=0;for(i in this) x++; return x-1};
var obj = {
'one': '1',
'two': '2'
}
alert(obj.length());
alert({'1': '1','2': '2',3:3}.length());
Правда теперь у объектов есть новое свойство length которе будет куда не надо влезать:) |
Цитата:
Monkey patching |
Цитата:
|
Чуваки, спасибо! не зря я вас БРАВЫМИ назвал!:yes:
Magneto, мне очередной раз напомнил давно известную истину: что первым в голову пришло, то и верно. цепочка по идее так и выстраивалась, пришедший JSON в цикл и поехали, а потом я задумался... нет чтоб проверить.... кстати, GuardCat, идея все же прикольная двоеточия считать, я когда на фигурные скобки глядел, мелькала мысль их посчитать. ЖЭСТЬ братцы, нужен отдых! Спасибо еще раз! |
| Часовой пояс GMT +3, время: 00:42. |