2010-03-12 5 views
5

Tengo una cadena st devuelta desde un servicio web. Convierto la cuerda en un objeto, ¿cómo puedo contar el no? de matrices dentro de ella? (En este caso se trata de)jContexto de objetos de Son

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

json.length siempre está volviendo

Respuesta

17

@ coure06 He cambiado un poco su JSON. Esperamos que esto sea útil

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++; 
    } 
} 

Live example at jsfiddle

+1

debe utilizar hasOwnProperty: 'for (var x de personas) si (persons.hasOwnProperty (x)) cuenta ++; ' – vsync

-1
  1. Eso no es una expresión JSON válida.
  2. No hay una forma integrada de contar "miembros" de un objeto. Puedes escribir uno, pero es problemático debido a la naturaleza blando del idioma.

edición — ahora que lo he hecho para el futuro, es posible utilizar las API como Object.keys(), Object.getOwnPropertyNames(), y Object.getOwnPropertySymbols para obtener un recuento de las propiedades de un objeto:

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

En mi experiencia, es bastante raro que me haya importado el número de propiedades en un objeto; generalmente, si no sabe qué es un objeto, le interesan propiedades específicas (por nombre). Sin embargo, no hay nada de malo con el uso de esas API.

5

Me sorprende json.length está devolviendo algo; esa cadena JSON no es válida. Las llaves más externas ({}) denotan un objeto, que debe contener claves y valores, pero solo contiene un valor (la matriz, sin clave).

Si quita las llaves, debería funcionar correctamente. ¿Los pusiste allí, tal vez porque lo habías visto hecho? Si es así, quiere paréntesis (()), no llaves.

Tenga en cuenta que el uso de eval en cadenas JSON no es seguro, si desea utilizar un decodificador de JSON que no utiliza eval (como json2.js, que utiliza eval, pero sólo después de muy asegurar cuidadosamente que es seguro hacerlo, modificándolo si es necesario), para una seguridad óptima. Los paréntesis ayudan, pero no son en absoluto una solución completa.

2

Aquí está el truco!

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

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

alert(objCount); 
1
Try

usando esto,

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()); 

esto podría funcionar para objetos anidados como

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

Elegante, bien hecho! –

+0

Extender el objeto no es la mejor idea http://stackoverflow.com/a/6877100/179669 – Bakudan

Cuestiones relacionadas