Количество объектов jSon - PullRequest
5 голосов
/ 12 марта 2010

У меня есть строка st, возвращенная из веб-службы. Я преобразую строку в объект, как я могу сосчитать нет. массивов внутри него? (для этого случая это 2 )

var st = "{[{"Name": "fake", "Address": "add"]},[{"Name": "fake", "Address": "add"}]}";  
var json = eval(st);  

json.length всегда возвращается 1

Ответы [ 5 ]

17 голосов
/ 30 января 2011

@ coure06 Я немного изменил твой JSON. Надеюсь, это будет полезно

var persons = {
    "person1" : {
        "Name": "Adam",
        "Address": "USA" 
    },
    "person2" : {
        "Name": "Jamie",
        "Address": "USA" 
    }
};
var count = 0;
//var count = persons.length;          // wont work
for ( property in persons )          // should return 2
{
   if(persons.hasOwnProperty(property))
   {
      count++;
   }
}

Живой пример на jsfiddle

5 голосов
/ 12 марта 2010

Я удивлен json.length возвращает что-нибудь; эта строка JSON недопустима. Внешние фигурные скобки ({}) обозначают объект, который должен содержать ключи и значения, но он просто содержит значение (массив без ключа).

Если вы удалите фигурные скобки, он должен работать правильно. Вы положили их туда, возможно, потому что видели, как это было сделано? Если это так, вам нужны скобки (()), а не фигурные скобки.

Обратите внимание, что использование eval в строках JSON небезопасно, вы хотите использовать JSON-декодер, который не использует eval (например, json2.js , который использует eval, но только после очень тщательного обеспечения того, чтобы это было безопасно сделать, модифицируя его при необходимости), для оптимальной безопасности. Скобки помогают, но они не являются полным решением.

2 голосов
/ 21 ноября 2012

Вот трюк!

var jsonString = "{field1:'data1',field2:'data2',arrField1:['arrField1Content1','arrField1Content2']}";
var obj = eval('(' + jsonString + ')');

var objCount=0;
for(_obj in obj) objCount++;

alert(objCount);
1 голос
/ 02 апреля 2013

Попробуйте использовать это,

var persons = {
    "person1" : {
        "Name": "Adam",
        "Address": "USA" 
    },
    "person2" : {
        "Name": "Jamie",
        "Address": "USA" 
    }
};

Object.prototype.count = function() {
    var that = this,
        count = 0;

    for(property in that) {
        if(that.hasOwnProperty(property)) {
            count++;
        }
    }

    return count;
};

alert(persons.count());

это может работать для вложенных объектов, таких как

var persons = {
    "person1" : {
        "Name": "Adam",
        "Address": "USA" 
    },
    "person2" : {
        "Name": "Jamie",
        "Address": "USA" ,
        "users": {
            "person1" : {
                "Name": "Adam",
                "Address": "USA" 
            },
            "person2" : {
                "Name": "Jamie",
                "Address": "USA" 
            }
        }
    }
};

alert(persons.person2.users.count());
0 голосов
/ 12 марта 2010
  1. Это недопустимое выражение JSON.
  2. Не существует встроенного способа подсчета "членов" объекта. Вы можете написать один, но это проблематично из-за мягкого характера языка.

edit & mdash; теперь, когда я сделал это в будущем, можно использовать API, такие как Object.keys(), Object.getOwnPropertyNames() и Object.getOwnPropertySymbols, чтобы получить количество свойств в объекте:

var props = Object.getOwnPropertySymbols(someObject);
var length = props.length; // number of properties

По моему опыту, довольно редко я заботился о количестве свойств в объекте; обычно, если вы не знаете, что это за объект, вы заинтересованы в определенных свойствах (по имени). Однако в использовании этих API нет ничего плохого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...