Question Longueur d'un objet JavaScript


Si j'ai un objet JavaScript, disons

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

Y a-t-il une méthode de meilleure pratique intégrée ou acceptée pour obtenir la longueur de cet objet?


1820
2017-08-07 19:42


origine


Réponses:


La réponse la plus robuste (c'est-à-dire qui capture l'intention de ce que vous essayez de faire en causant le moins de bogues) serait:

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);

Il y a une sorte de convention en JavaScript que vous n'ajoutez pas de choses à Object.prototype, car il peut casser les énumérations dans diverses bibliothèques. Ajout de méthodes à Object est généralement sûr, cependant.


Voici une mise à jour à partir de 2016 et déploiement généralisé de l'ES5 et au-delà.  Pour IE9 + et tous les autres navigateurs compatibles ES5 + modernes, vous pouvez utiliser Object.keys() donc le code ci-dessus devient juste:

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

Cela n'a pas à modifier un prototype existant depuis Object.keys() est maintenant intégré.

modifier: Les objets peuvent avoir des propriétés symboliques qui ne peuvent pas être renvoyées via la méthode Object.key. Donc la réponse serait incomplète sans les mentionner.

Le type de symbole a été ajouté au langage pour créer des identifiants uniques pour les propriétés de l'objet. Le principal avantage du type de symbole est la prévention des écrasements.

Object.keys ou Object.getOwnPropertyNames ne fonctionne pas pour les propriétés symboliques. Pour les retourner, vous devez utiliser 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 vous savez que vous n'avez pas à vous soucier de hasOwnProperty chèques, vous pouvez le faire très simplement:

Object.keys(myArray).length

1407
2018-04-03 01:44



Actualisé: Si vous utilisez Underscore.js (recommandé, c'est léger!), alors vous pouvez simplement faire

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

Si non, et vous ne voulez pas vous tromper avec les propriétés de l'objet pour une raison quelconque, et utilisez déjà jQuery, un plugin est également accessible:

$.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



Utilisez quelque chose d'aussi simple que:

Object.keys(obj).length

Il ne doit pas être difficile et ne nécessite certainement pas une autre fonction à accomplir.


153
2017-10-27 03:46



Voici la solution la plus cross-navigateur.

C'est mieux que la réponse acceptée car elle utilise des objets Object.keys natifs s'il existe. Ainsi, c'est le plus rapide pour tous les navigateurs modernes.

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



Je ne suis pas un expert JavaScript, mais il semblerait que vous deviez parcourir les éléments et les compter car Object n'a pas de méthode de longueur:

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

@palmsey: Par souci d'équité vis-à-vis de l'OP, la documentation JavaScript fait explicitement référence à l'utilisation de variables de type Object de cette manière en tant que "tableaux associatifs".


27
2017-08-07 19:52



Cette méthode obtient tous les noms de propriété de votre objet dans un tableau, de sorte que vous pouvez obtenir la longueur de ce tableau qui est égale à la longueur des clés de votre objet.

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

25
2017-07-01 12:40



Pour ne pas jouer avec le prototype ou un autre code, vous pouvez construire et étendre votre propre objet:

function Hash(){
    var length=0;
    this.add = function(key, val){
         if(this[key] == undefined)
         {
           length++;
         }
         this[key]=val;
    }; 
    this.length = function(){
        return length;
    };
}

myArray = new Hash();
myArray.add("lastname", "Simpson");
myArray.add("age", 21);
alert(myArray.length()); // will alert 2

Si vous utilisez toujours la méthode add, la propriété length sera correcte. Si vous craignez que vous ou d'autres ne l'utilisiez pas, vous pouvez également ajouter le compteur de propriétés que les autres ont également envoyé à la méthode length.

Bien sûr, vous pouvez toujours remplacer les méthodes. Mais même si vous le faites, votre code échouerait probablement sensiblement, ce qui le rendrait facile à déboguer. ;)


19
2018-06-11 15:44



Voici comment et ne pas oublier de vérifier que la propriété n'est pas sur la chaîne du prototype:

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

14
2017-08-08 19:18



Voici une solution complètement différente qui ne fonctionnera que dans les navigateurs plus modernes (IE9 +, Chrome, Firefox 4+, Opera 11.60+, Safari 5.1+)

Voir jsFiddle

Configurez votre classe Array associative

/**
 * @constructor
 */
AssociativeArray = function () {};

// Make the length property work
Object.defineProperty(AssociativeArray.prototype, "length", {
    get: function () {
        var count = 0;
        for (var key in this) {
            if (this.hasOwnProperty(key))
                count++;
        }
        return count;
    }
});

Maintenant, vous pouvez utiliser ce code comme suit ...

var a1 = new AssociativeArray();
a1["prop1"] = "test";
a1["prop2"] = 1234;
a1["prop3"] = "something else";
alert("Length of array is " + a1.length);

13
2017-08-02 08:49