2010-03-08 8 views
6

J'utilise un tableau associatif javascript comme:longueur de tableau associatif javascript en utilisant jQuery

var testarray = []; 
testarray['one'] = '1'; 
testarray['two'] = '2'; 
testarray['three'] = '3'; 

Je suis également en utilisant jquery à côté. Comment puis-je vérifier la longueur de ce tableau associatif en utilisant jquery ou toute autre méthode? Fondamentalement, je veux vérifier si ce tableau est vide ou non.

Merci.

+1

dupe; bonne réponse @ http://stackoverflow.com/questions/5223/length-of-javascript-associative-array –

+1

JavaScript n'a pas de "tableaux associatifs", il a "tableaux" et "objets". Si vous souhaitez utiliser des propriétés nommées, utilisez un objet brut ('{}') et non un tableau. – Quentin

+0

@David: Point sémantique, mais je dirais dans l'autre sens: ** Tous ** Les objets JavaScript sont des tableaux associatifs (pas seulement le type 'Array', bien que ce soit aussi le cas). Ils ont des clés de chaîne qui peuvent être énumérées, des entrées qui peuvent être ajoutées et supprimées ('delete') ad hoc, etc .. (Convenu que si vous n'utilisez pas d'index numériques, vous ne voulez pas utiliser un' Array' –

Répondre

9

Il n'y a pas d'appel direct de "longueur" ou de "taille", vous devez tester les touches disponibles dans l'objet.

Notez que tous, de sorte que votre code serait probablement préférable d'utiliser un objet générique plutôt qu'un tableau sont des tableaux associatifs (cartes) objets JavaScript:

var testarray = {}; // <= only change is here 
testarray['one'] = '1'; 
testarray['two'] = '2'; 
testarray['three'] = '3'; 

Vous pouvez découvrir ce que les clés sont dans un objet en utilisant for..in:

var name; 
for (name in testarray) { 
    // name will be 'one', then 'two', then 'three' (in no guaranteed order) 
} 

... avec lequel vous pouvez construire une fonction pour tester si l'objet est vide.

function isEmpty(obj) { 
    var name; 
    for (name in obj) { 
     return false; 
    } 
    return true; 
} 

Comme CMS signalé dans sa réponse, qui guidera à travers toutes les clés, y compris les clés sur le prototype de l'objet. Si vous ne souhaitez que des clés sur l'objet et non son prototype, utilisez le haut-hasOwnProperty fonction:

function isEmpty(obj) { 
    var name; 
    for (name in obj) { 
     if (obj.hasOwnProperty(name)) { 
      return false; 
     } 
    } 
    return true; 
} 
+4

Et n'oubliez pas non plus 'hasOwnProperty()' pour ne pas compter les propriétés du prototype. – MBO

+1

devrait probablement utiliser le truc "hasOwnProperty", quelque chose que je ne connaîtrais pas si je ne suis pas devenu accro à stackoverflow :-) – Pointy

+0

@ MBO, Pointy, et (indirectement) CMS: Tout à fait raison, ajouté! –

19

Vous ne devriez pas utiliser un tableau pour stocker les index non numériques, vous devez utiliser un objet simple:

function getObjectLength (o) { 
    var length = 0; 

    for (var i in o) { 
    if (Object.prototype.hasOwnProperty.call(o, i)){ 
     length++; 
    } 
    } 
    return length; 
} 

Edit: Puisque vous utilisez jQuery et que vous voulez vérifier si l'objet est "vide", la version 1.4 a introduit le $.isEmptyObject

if ($.isEmptyObject(obj)) { 
    //... 
} 
+0

ooh J'aime que vous obtenez "hasOwnProperty" du prototype de l'objet :-) – Pointy

+0

Vous ne devriez pas utiliser un tableau pour stocker * seulement * des index non numériques (comme je l'ai dit dans ma réponse), mais je ne vois pas problème avec * aussi * le stockage des informations non numériques sur les tableaux que vous utilisez pour leur usage "normal". –

+0

Pourquoi ne pas utiliser 'hasOwnProperty' sur' o' lui-même? Pour éviter qu'il ait été éventuellement remplacé? –

0

Vous n'avez pas vraiment un tableau là-bas, donc j'éviter initialisant comme tel:

var testNotArray = { }; 
testNotArray['one'] = 'something'; 
// ... 

Maintenant, c'est dangereux en soi, mais une première étape pourrait être:

function objectSize(o) { 
    var c = 0; 
    for (var k in o) 
    if (o.hasOwnProperty(k)) ++c; 
    return c; 
} 

Encore une fois , il y a des millions de façons bizarres que cette approche pourrait échouer.

0

Vous pouvez calculer la longueur comme ci-dessous:

var testarray = {}; // Use a generic object to store non-numeric indexes not an array 
testarray['one'] = '1'; 
testarray['two'] = '2'; 
testarray['three'] = '3'; 
var count = 0 
for each(key in testarray) 
count = count + 1 
alert(count); // count contains the number of items in the array 
0

Vous pouvez parcourir les propriétés de les compter:

var cnt = 0; 
for (i in testarray) cnt++; 
alert(cnt); 

Notez que le for (... in ...) aura aussi des éléments de boucle ajoutée par un prototype, donc vous voudrez peut-être compter uniquement les éléments ajoutés après cela:

var cnt = 0; 
for (i in testarray) if (testarray.hasOwnProperty(i)) cnt++; 
alert(cnt); 

Si vous voulez juste pour vérifier s'il y a des propriétés, vous pouvez sortir de la boucle après le premier élément:

var empty = true; 
for (i in testarray) if (testarray.hasOwnProperty(i)) { empty = false; break; } 
alert(empty); 
1

J'ai eu ce problème aussi, et je viens de réaliser la solution (et testé dans mon navigateur) :

//given: ass_arr, an associative array 
//result: count now holds the "length" of ass_arr 
var count = 0; 
$.each(ass_arr, function(key, val) { count+=1; }); 
alert(count); //number of iterable attributes in ass_arr 

Faites-moi savoir si cela fonctionne pour vous! Je l'écris à droite dans mon code comme ceci:

var devices = STATUS.devices, 
    num_devices = 0; 
$.each(devices, function(id, device) { num_devices+=1; }); 
//num_devices set to number of devices 
12

Cela vous donne la longueur de votre tableau associatif:

Object.keys(testarray).length 
Questions connexes