2009-07-02 10 views
11

Sto provando a utilizzare l'oggetto JavaScript come array associativo e tutto è andato bene finché non ho avuto bisogno di ottenere il numero di voci che sono state memorizzate. Qual è il modo più semplice ed elegante per farlo? Tutto quello che posso pensare è eseguire la funzione loop for each o jQuery $.each e vedere solo quante iterazioni farebbe, ma sembra una cosa orribile da fare.Come ottengo il numero di campi nell'oggetto JavaScript?

risposta

29

Il vecchio Firefox supporta la proprietà __count__. Gli ambienti più recenti supportano gli ES5 Object.keys. Per gli ambienti più anziani dobbiamo fallback a poco l'iterazione sopra l'oggetto e il conteggio manuale (ugh!):

function count(obj) { 

    if (obj.__count__ !== undefined) { // Old FF 
     return obj.__count__; 
    } 

    if (Object.keys) { // ES5 
     return Object.keys(obj).length; 
    } 

    // Everything else: 

    var c = 0, p; 
    for (p in obj) { 
     if (obj.hasOwnProperty(p)) { 
      c += 1; 
     } 
    } 

    return c; 

} 
+4

Oh mio dio, O (n) per ottenere il numero di voci in una mappa ... Beh, questo fa schifo. :/ – fgysin

+1

(Non dire che la risposta non è corretta btw. Appena deluso da JS ...) – fgysin

+0

Cosa significano i vecchi browser? Vedi: http://kangax.github.io/compat-table/es5/#Object.keys – leo

2

Si riduce a questo, o si mantiene il conto quando si aggiungono e si eliminano le proprietà dall'oggetto.

2

sfortunatamente non c'è davvero un buon modo per conoscere il numero di proprietà in un oggetto senza iterare su di esse. Quanto segue è abbastanza semplice:

3

Credo che questo sia stato risolto qui prima, e/o googling può portarvi nella giusta direzione. Tuttavia vorrei sottolineare che uno dei più grandi grattacapi se si utilizza un ciclo in forma di:

for (var attr in obj) { .... 

è che l'oggetto potrebbe essere ingombra di proprietà non hai necessariamente aggiungere, e la soluzione standard a questo come Ricordo che è necessario utilizzare il test per hasOwnProperty, vedere https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/hasOwnProperty

22

questo ha funzionato per me:

Object.keys(obj).length 
+0

IE specifico sembra (vedi la risposta di James) –

+0

Questo dovrebbe essere contrassegnato come la risposta corretta. –

Problemi correlati