Pregunta

¿Hay una manera de conseguir (de alguna parte) el número de elementos en un objeto de javascript ?? (Es decir, constante de tiempo complejidad).

No puedo encontrar una propiedad o un método que recuperar esa información. Hasta ahora sólo puedo pensar en hacer una iteración a través de toda la colección, pero eso es el tiempo lineal.
Es extraño que no hay acceso directo al tamaño del objeto, no te parece.

EDIT:
Estoy hablando sobre el objeto Object (no objetos en general):

var obj = new Object ;
¿Fue útil?

Solución

A pesar de que las implementaciones JS pueden realizar un seguimiento de un valor tal internamente, no hay forma estándar para conseguirlo.

En el pasado, la variante de Javascript de Mozilla expuso la no __count__ -Estándar, pero se ha eliminado con la versión 1.8.5.

Para secuencias de comandos entre el navegador que está pegado con la iteración de forma explícita sobre las propiedades y la comprobación hasOwnProperty():

function countProperties(obj) {
    var count = 0;

    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            ++count;
    }

    return count;
}

En caso de ECMAScript 5 implementaciones capaces, esto puede también ser escrito como (Kudos Avi lino )

function countProperties(obj) {
    return Object.keys(obj).length;
}

Tenga en cuenta que también se perderá propiedades que no son enumerables (por ejemplo length de una matriz).

Si va a utilizar un framework como jQuery, Prototype, Mootools, cualquiera que sea $-el-más reciente-bombo, comprobar si vienen con su propia colección de API, lo que podría ser una mejor solución a su problema de utilizar objetos JS nativos .

Otros consejos

Para hacer esto en cualquier entorno compatible con ES5

Object.keys(obj).length

(Navegador de apoyo href="http://kangax.github.com/es5-compat-table/" aquí )
(Doc en Object.keys aquí , incluye el método puede agregar a los navegadores no ECMA5)

si que ya están usando jQuery en su construcción a hacer esto:

$(yourObject).length

Se trabaja muy bien para mí en los objetos, y ya tenía jQuery como una dependencia.

function count(){
    var c= 0;
    for(var p in this) if(this.hasOwnProperty(p))++c;
    return c;
}

var O={a: 1, b: 2, c: 3};

count.call(O);

Que yo sepa, no hay manera de hacer esto de forma fiable, a menos que cambie a una matriz. Que sinceramente, no parecer extraño -. Que es parece bastante sencillo para mí que las matrices son contables, y los objetos no son

Probablemente el que más se aproxima es algo como esto

// Monkey patching on purpose to make a point
Object.prototype.length = function()
{
  var i = 0;
  for ( var p in this ) i++;
  return i;
}

alert( {foo:"bar", bar: "baz"}.length() ); // alerts 3

Sin embargo, esto crea problemas, o al menos preguntas. Todas las propiedades creadas por el usuario se cuentan, entre ellos la propia función _length! Y si bien en este ejemplo sencillo podría evitar que sólo por el uso de una función normal, eso no significa que usted puede dejar de otras secuencias de comandos de hacer esto. ¿Entonces, Qué haces? No haga caso de propiedades de la función?

Object.prototype.length = function()
{
  var i = 0;
  for ( var p in this )
  {
      if ( 'function' == typeof this[p] ) continue;
      i++;
  }
  return i;
}

alert( {foo:"bar", bar: "baz"}.length() ); // alerts 2

Al final, creo que probablemente debería abandonar la idea de hacer sus objetos contable y encontrar otra manera de hacer lo que sea que estás haciendo.

El concepto de número / longitud / dimensionalidad no tiene mucho sentido para un objeto, y que necesitan que sugiere que realmente desea una matriz para mí.

Edit: me señaló que desea un O (1) para esto. A lo mejor de mi conocimiento no existe tal manera me temo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top