Pregunta Longitud de un objeto de JavaScript


Si tengo un objeto JavaScript, diga

var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;

¿Existe una forma de práctica recomendada incorporada o aceptada para obtener la longitud de este objeto?


1820
2017-08-07 19:42


origen


Respuestas:


La respuesta más robusta (es decir, que capta la intención de lo que intenta hacer mientras causa la menor cantidad de errores) sería:

Object.size = function(obj) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

// Get the size of an object
var size = Object.size(myArray);

Hay una especie de convención en JavaScript que no agregue cosas a Object.prototype, porque puede romper enumeraciones en varias bibliotecas. Sin embargo, agregar métodos a Object suele ser seguro.


Aquí hay una actualización a partir de 2016 y despliegue generalizado de ES5 y más allá.  Para IE9 + y todos los demás navegadores modernos con capacidad ES5 +, puede usar Object.keys() entonces el código anterior simplemente se convierte en:

var size = Object.keys(myObj).length;

Esto no tiene que modificar ningún prototipo existente desde Object.keys() ahora está incorporado.

Editar: Los objetos pueden tener propiedades simbólicas que no pueden devolverse mediante el método Object.key. Entonces la respuesta sería incompleta sin mencionarlos.

El tipo de símbolo fue agregado al lenguaje para crear identificadores únicos para las propiedades del objeto. El principal beneficio del tipo de símbolo es la prevención de sobreescrituras.

Object.keys o Object.getOwnPropertyNames no funciona para propiedades simbólicas. Para devolverlos necesitas usar Object.getOwnPropertySymbols.

var person = {
  [Symbol('name')]: 'John Doe',
  [Symbol('age')]: 33,
  "occupation": "Programmer"
};

const propOwn = Object.getOwnPropertyNames(person);
console.log(propOwn.length); // 1

let propSymb = Object.getOwnPropertySymbols(person);
console.log(propSymb.length); // 2

2011
2017-08-09 08:31



Si sabes que no tienes que preocuparte por hasOwnProperty cheques, puedes hacer esto de manera muy simple:

Object.keys(myArray).length

1407
2018-04-03 01:44



Actualizado: Si estás usando Underscore.js (¡recomendado, es liviano!), entonces puedes simplemente hacer

_.size({one : 1, two : 2, three : 3});
=> 3

Si no, y no quiere perder el tiempo con las propiedades de Object por cualquier motivo, y ya está utilizando jQuery, un complemento es igualmente accesible:

$.assocArraySize = function(obj) {
    // http://stackoverflow.com/a/6700/11236
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

252
2017-07-05 14:39



Use algo tan simple como:

Object.keys(obj).length

No tiene por qué ser difícil y definitivamente no requiere otra función para lograr.


153
2017-10-27 03:46



Aquí está la solución más entre navegadores.

Esto es mejor que la respuesta aceptada porque usa Object.keys nativas si existe. Por lo tanto, es el más rápido para todos los navegadores modernos.

if (!Object.keys) {
    Object.keys = function (obj) {
        var arr = [],
            key;
        for (key in obj) {
            if (obj.hasOwnProperty(key)) {
                arr.push(key);
            }
        }
        return arr;
    };
}

Object.keys(obj).length;

43
2017-09-01 16:12



No soy un experto en JavaScript, pero parece que tendrías que recorrer los elementos y contarlos, ya que Object no tiene un método de longitud:

var element_count = 0;
for (e in myArray) {  if (myArray.hasOwnProperty(e)) element_count++; }

@palmsey: para ser justos con el OP, la documentación de JavaScript se refiere explícitamente al uso de variables de tipo Object de esta manera como "arrays asociativos".


27
2017-08-07 19:52



Este método obtiene todos los nombres de propiedad de su objeto en una matriz, de modo que puede obtener la longitud de esa matriz que es igual a la longitud de las claves de su objeto.

Object.getOwnPropertyNames({"hi":"Hi","msg":"Message"}).length; // => 2

25
2017-07-01 12:40