2010-03-08 26 views
6

estoy usando como matriz asociativa javascript:Javascript longitud de la matriz asociativa usando jQuery

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

También estoy usando jQuery lado. ¿Cómo puedo verificar la longitud de esta matriz asociativa usando jquery o cualquier otro método? Básicamente, quiero verificar si esta matriz está vacía o no.

Gracias.

+1

víctima; buena respuesta @ http://stackoverflow.com/questions/5223/length-of-javascript-associative-array –

+1

JavaScript no tiene "matrices asociativas", tiene "matrices" y "objetos". Si desea usar propiedades con nombre, use un objeto simple ('{}') que no sea una matriz. – Quentin

+0

@David: punto semántico, pero lo diría al revés: ** Todos los objetos ** JavaScript son matrices asociativas (no solo el tipo 'Array', aunque por supuesto también). Tienen claves de cadena que se pueden enumerar, entradas que pueden agregarse y eliminarse ('delete') ad hoc, etc. (Está de acuerdo en que si no está usando índices numéricos, no quiere usar un' Array' .) –

Respuesta

9

No hay llamadas directas de "longitud" o "tamaño", debe probar las claves disponibles dentro del objeto.

Tenga en cuenta que todo JavaScript objetos son matrices asociativas (mapas), por lo que su código, probablemente sería mejor usar un objeto genérico en lugar de una matriz:

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

Usted puede averiguar lo que las llaves están en un objeto utilizando for..in:

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

... con la que se puede construir una función para comprobar si el objeto está vacío.

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

Como CMS marcada en su respuesta, que le guiará a través de todas las claves, incluyendo teclas de prototipo del objeto. Si sólo desea teclas del objeto y no su prototipo, utilizar el incorporado en hasOwnProperty función:

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

Y también no se olvide de 'hasOwnProperty()' para no contar las propiedades del prototipo. – MBO

+1

probablemente debería usar el truco de "hasOwnProperty", algo que no sabría si no me hubiera vuelto adicto al stackoverflow :-) – Pointy

+0

@MBO, Pointy, e (indirectamente) CMS: ¡Muy bien, agregó! –

19

No debe utilizar una matriz para almacenar los índices no numéricos, se debe utilizar un objeto simple:

function getObjectLength (o) { 
    var length = 0; 

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

Editar: dado que está utilizando jQuery y desea comprobar si el objeto está "vacía", la versión 1.4 introdujo el $.isEmptyObject

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

ooh Me gusta que obtienes "hasOwnProperty" del prototipo Object :-) – Pointy

+0

No debes usar una matriz para almacenar * solo * índices no numéricos (como dije en mi respuesta), pero no veo ninguna problema con * también * el almacenamiento de información no numérica en las matrices que está utilizando para su propósito "normal". –

+0

¿Por qué no utilizar 'hasOwnProperty' en' o'? Para evitar que posiblemente haya sido reemplazado? –

0

En realidad, no tiene una matriz allí, así que me gustaría evitar la inicialización como tal:

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

Ahora bien, esto es inherentemente peligroso, pero un primer paso podría ser:

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

De nuevo , hay un millón de formas extrañas de que ese enfoque podría fallar.

0

Se puede calcular la longitud, como a continuación:

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

puede recorrer las propiedades de contarlos:

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

Tenga en cuenta que la for (... in ...) también elementos de bucle agregado por un prototipo, por lo Es posible que desee contar solo los elementos agregados después de eso:

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

If lo que desea es comprobar si hay algún propiedades, puede salir fuera del circuito después de que el primer elemento:

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

tuve este problema también, y me di cuenta de la solución (y lo ha probado en el navegador) :

//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 

¡Avísame si esto funciona para ti! Estoy escribiendo la derecha por mi código como este:

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

Esto le da la longitud de su matriz asociativa:

Object.keys(testarray).length 
Cuestiones relacionadas