La longitud de un objeto de JavaScript

javascript javascript-objects


Tengo un objeto de JavaScript,¿hay una forma incorporada o aceptada de mejor práctica para obtener la longitud de este objeto?

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



Answer 1 James Coglan


La respuesta más robusta (es decir,que capta la intención de lo que se intenta hacer mientras se causan menos bichos)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(myObj);

Hay una especie de convención en JavaScript en la que no agrega cosas al Object.prototype , porque puede romper las enumeraciones en varias bibliotecas. Sin embargo, agregar métodos a Object generalmente es seguro.


Aquí hay una actualización a partir de 2016 y una implementación generalizada de ES5 y más allá. Para IE9 + y todos los demás navegadores modernos compatibles con ES5 +, puede usar Object.keys() para que el código anterior se convierta en:

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

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

Editar : los objetos pueden tener propiedades simbólicas que no se pueden devolver a través del método Object.key. Entonces la respuesta sería incompleta sin mencionarlos.

El tipo de símbolo se añadió al lenguaje para crear identificadores únicos para las propiedades de los objetos.El principal beneficio de Symbol type es la prevención de sobrescritura.

Object.keys o Object.getOwnPropertyNames no funciona para propiedades simbólicas. Para devolverlos, debe 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



Answer 2 aeosynth


Si sabe que no tiene que preocuparse por hasOwnProperty comprobaciones de hasOwnProperty , puede hacerlo de manera muy simple:

Object.keys(myArray).length



Answer 3 ripper234


Actualizado : si está utilizando Underscore.js (¡recomendado, es liviano!), Entonces simplemente puede hacer

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

Si no es así , y no desea perder el tiempo con las propiedades de Object por cualquier razón, 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;
};



Answer 4 Joon


Aquí está la solución más cruzada de los navegadores.

Esto es mejor que la respuesta aceptada porque usa claves de objetos nativos si existen.Por lo tanto,es la más rápida 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;



Answer 5 jj33


No soy experto en JavaScript,pero parece que tendrías que hacer un bucle a través de los elementos y contarlos ya que el objeto no tiene un método de longitud:

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

@palmsey: In fairness to the OP, the JavaScript documentation actually explicitly refer to using variables of type Object in this manner as "associative arrays".