2010-06-11 15 views
20

estoy usando PHP para JSON codificar un enorme despliegue multidimensional de eventos, por lo que obtener algo como esto:¿cómo puedo ver si un objeto grande JSON contiene un valor?

var ents = {"7":{"event_id":"7","nn":"The Whisky Drifters","nn_url":"the-whisky-drifters", 
    "venue":"The Grain Barge","date_num":"2010-06-11","date_txt":"Friday 11th June", 
    "gig_club":"1","sd":"A New Acoustic String Band...","ven_id":"44", 
    "art":0},"15":{"event_id":"15","nn":"Bass Kitchen","nn_url":"bass-kitchen", 
    "venue":"Timbuk2","date_num":"2010-06-11","date_txt":"Friday 11th June", 
    "gig_club":"2","sd":"Hexadecimal \/ DJ Derek \/ Id","ven_id":"21", 
    "art":1}, 

la primera dimensión es la identificación, ver

var ents = {"7":{ 

Por lo que es posible obtener los identificadores sin examinar los objetos anidados ...

¿Cuál es la forma más rápida y más eficiente de verificar si mi JSON contiene una identificación?

Respuesta

45

Puede utilizar el método hasOwnProperty:

if (ents.hasOwnProperty('7')) { 
    //.. 
} 

cheques este método si el objeto contiene la propiedad especificada independientemente de su valor.

Es más rápido que el operador in porque no comprueba las propiedades heredadas.

+0

@Haroldo, solo quiere comprobar si una identificación específica (propiedad de primer nivel) sale correcta ¿verdad? o quieres extraer todos esos nombres de propiedad? – CMS

+0

simplemente compruebe si el ID existe – Haroldo

2

Adicionalmente a lo que dijo CMS: Si necesita todas las propiedades, puede recorrer a través de los porperties con for ... in:

for (prop in ents) { 
    alert(prop); // Shows "7", "15", etc. 
    // Accessing the sub-object: 
    alert(ents[prop].nn); // Shows the names of each event 
} 

también que no es una "matriz multidimensional". Es un objeto (con más objetos anidados).

+0

era una matriz multidimensional cuando estaba en PHP a menos que me equivoque – Haroldo

2

sí, es posible, pero tiene que recorrer el objeto json completo en el lado del cliente.

var JSONobj = ents, yourid; 
for(key in JSONobj) 
{ 
    if(((typeof key) == 'number') && key==yourid) 
     alert(key); 
} 

si está utilizando jQuery continuación, puede utilizar $ .Cada método para fetchng llaves de JSONObject

var JSONobj = ents, yourid; 
     $.each(JSONobj, function(key, value){  
      if(((typeof key) == 'number') && key==yourid) 
       alert(key); 
      //ids.push(key); 
     }); 
+0

¿sería más eficiente comprobar si el valor es un número entero antes de ver si coincide con mi id de consulta, o hacer ¿Crees que es mejor tener un objeto separado solo de identificadores? – Haroldo

+0

puede agregar ambos cheques en una línea, es decir, si (((typeof key) == 'number') && key == yourid) entonces no necesitará una matriz para guardar todos los ids. –

-1

Sólo tiene que utilizar myObject.has("keyName"). Esto es lo que realmente funciona.

+0

¡No! Object.has no es una función. Acabo de probarlo, y MDN no lo menciona: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object Así que no es "lo que realmente funciona". – Andrew

Cuestiones relacionadas