Сколько объектов/массивов содержит 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, время: 15:58. |