2010-08-20 6 views
7

Laissez-moi vous expliquer en détail. J'ai ci-dessous un objet avec moi -Existe-t-il un moyen d'obtenir le nombre d'éléments à partir d'un objet?

{ 
    "OBJECT1" : { 
     "NAME1" : "VALUE1", 
     "NAME2" : "VALUE2", 
     "NAME3" : "VALUE3" 
    }, 
    "OBJECT2" : { 
     "NAME4" : "VALUE4", 
     "NAME5" : "VALUE5" 
    } 
} 

De cet objet, je veux obtenir quelque chose comme nombre d'éléments dans Object1 = 3 et le nombre d'éléments dans Object2 = 2. Si tout cela est possible en utilisant javascript. Fondamentalement, ce que j'essaie de faire est de faire une boucle sur les paires de valeurs de nom disponibles dans l'objet dynamiquement de sorte que si quelqu'un ajoute un autre élément à l'objet, je n'ai pas besoin de changer mon code.

De même toute alternative est également exclue car je suis autorisé à utiliser uniquement des objets dans mon cas d'utilisation.

+0

double possible de [Longueur Javascript tableau Associatif] (http://stackoverflow.com/questions/5223/length-of-javascript-associative-array) – kennytm

+2

Ces objets ne sont pas appelés objets JSON. JSON est seulement une notation qui représente les objets * JavaScript *. –

+1

@Marcel Korpel: donc, est-il possible de dire qu'une telle chaîne JSON comme on le voit ici est une forme sérialisée d'un objet JS? – Piskvor

Répondre

9

Sans la conversion de votre objet, vous pouvez itérer sur les propriétés de comptage objet comme ceci:

function countObjectProperties(obj) 
{ 
    var count = 0; 
    for(var i in obj) 
     if(obj.hasOwnProperty(i)) 
      count++; 

    return count; 
} 

Développant pourquoi vous devez utiliser hasOwnProperty Comme je l'ai dit dans le commentaire ci-dessous, vous pouvez rencontrer un problème où une bibliothèque ou un navigateur a ajouté des méthodes et des propriétés aux objets, afin d'éviter de les compter, nous vérifions hasOwnProperty avant de le compter. More details at MSDN ou à Mozilla Developer Center

+0

Pourquoi hasOwnProperty est-il nécessaire (il suffit de demander)? – KeatsPeeks

+0

Génial, cela fonctionne très bien pour moi. Merci beaucoup. –

+2

@Samuel_xL Vous avez besoin de hasOwnProperty pour éviter de compter les fonctions, et d'autres builtins indésirables que le navigateur et/ou les plugins ont pu ajouter. –

4

Pour une chaîne JSON représentant un objet (ce qui est votre cas), vous ne pouvez pas utiliser de propriété de longueur. vous devez faire une boucle dans l'objet (voir la réponse de Kristoffer S Hansen).

Si elle représente un tableau , vous pouvez obtenir la longueur avec:

var len = arr.length; 

JQuery rend plus simple:

var len = $(JSON).length; 
+2

Non Jquery s'il vous plaît et aussi je suis censé éviter eval dans mes normes de projet. –

+0

eval était pour l'exemple de tableau, dont vous n'avez pas besoin de toute façon. C'était juste des informations supplémentaires :) Ok, j'ai supprimé eval car c'est hors sujet. – KeatsPeeks

+0

Ne pas utiliser 'eval' si ce n'est pas nécessaire. – Gumbo

1

Pour répondre à votre objectif plus large, comme indiqué dans votre question: Pour faire une boucle sur les propriétés, vous pouvez utiliser la construction for..in:

for (var item in myobject) { 
    // some browsers add more properties to every object, we don't want those 
    if (myobject.hasOwnProperty(item)) { 
    do_something(item); 
    } 
} 

En supposant que myobject est l'objet de votre question, cette boucle de volonté à travers elle et appeler do_something(OBJECT1) et do_something(OBJECT2); vous pouvez utiliser la même construction en boucle à travers les objets enfants:

// loop through OBJECT1 and OBJECT2 
for (var item in myobject) { 
    // some browsers add more properties to every object, we don't want those 
    if (myobject.hasOwnProperty(item)) { 
    // loop through the item's children 
    for (var pair in item) { 
     if (item.hasOwnProperty(pair)) { 
     // each of the name:value pairs will be passed to this 
     do_something_else(item,pair); 
     } 
    } 
    } 
} 
+0

Dans le deuxième extrait, il semble que 'item' est déjà la * clé * de chaque paire clé-valeur, donc cela n'a aucun sens de recommencer ... – Timwi

+0

@Timwi: En fait, non: dans la boucle externe, nous parcourons les propriétés de premier niveau, c'est-à-dire OBJECT1 et OBJECT2. Dans la boucle interne, nous itérons sur * leurs * propriétés, à savoir NAME1, NAME2, NAME3 et NAME4, NAME5, respectivement. Si l'imbrication allait plus loin, nous pourrions être en train d'itérer sur les objets plus profonds (peut-être que la récursivité pourrait être utilisée). – Piskvor

+0

Pour clarifier, dans la deuxième boucle, je suis l'itération des propriétés d'une propriété de l'objet de niveau supérieur ('myobject.OBJECT1.NAME1' etc.). Cette imbrication pourrait aller plus loin, mais pas dans ce cas. – Piskvor