Longueur D'un objet JavaScript

si j'ai un objet JavaScript, dites

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

y a-t-il un moyen intégré ou accepté d'obtenir la longueur de cet objet?

1881
demandé sur Gareth Simpson 2008-08-07 23:42:21

30 réponses

la réponse la plus robuste (c.-à-d. qui capte l'intention de ce que vous essayez de faire tout 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 dans JavaScript que vous n'ajoutez pas de choses pour objecter.prototype , parce qu'il peut briser des énumérations dans diverses bibliothèques. Ajouter des méthodes à L'objet est généralement sans danger, cependant.


Voici une mise à jour en date du 2016 et déploiement généralisé de ES5 et au-delà. pour IE9+ et tous les autres navigateurs ES5 + modernes, vous pouvez utiliser Object.keys() de sorte que le code ci-dessus devient juste:

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

il n'est pas nécessaire de modifier un prototype existant puisque Object.keys() est maintenant intégré.

Edit : les objets peuvent avoir des propriétés symboliques qui ne peuvent pas être retournées via L'objet.la clé de la méthode. Donc la réponse serait incomplète sans les mentionner.

Le type de symbole

a été ajouté au langage pour créer des identificateurs uniques pour les propriétés des objets. Le principal avantage du type de symbole est la prévention des surcharges.

Object.keys ou Object.getOwnPropertyNames ne fonctionne pas de la symbolique des propriétés. 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
2082
répondu SnnSnn 2018-05-15 21:48:10

si vous savez que vous n'avez pas à vous soucier des chèques hasOwnProperty , vous pouvez le faire très simplement:

Object.keys(myArray).length
1442
répondu aeosynth 2017-06-21 20:12:12

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

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

si ce n'est pas , et que vous ne voulez pas jouer avec les propriétés des objets pour quelque raison que ce soit, et que vous 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;
};
256
répondu ripper234 2012-07-08 10:30:58

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.

157
répondu Michael 2016-09-17 18:30:01

Voici la solution la plus cross-browser.

c'est mieux que la réponse acceptée parce qu'elle utilise un objet natif.les touches s'il existe. Ainsi, il 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;
45
répondu Joon 2013-09-01 16:12:06

Je ne suis pas un expert JavaScript, mais il semble que vous auriez à boucle à travers les éléments et les compter depuis objet n'a pas de méthode de longueur:

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

@palmsey: pour être honnête avec L'OP, la documentation JavaScript fait explicitement référence à l'utilisation de variables d'objet de type de cette manière comme des "tableaux associatifs".

29
répondu jj33 2016-09-17 18:27:26

cette méthode obtient tous les noms de propriétés 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
26
répondu venkat7668 2015-02-06 19:43:01

pour ne pas déconner 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 oublient de l'utiliser, vous pouvez ajouter le compteur de propriétés que les autres ont posté à la méthode de longueur, aussi.

bien sûr, vous pourriez toujours écraser les méthodes. Mais même si vous le faites, votre code serait probablement pas visiblement, le rendant facile à déboguer. ;)

21
répondu DanMan 2015-08-08 01:37:04

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

var element_count = 0;
for(var e in myArray)
    if(myArray.hasOwnProperty(e))
        element_count++;
15
répondu doekman 2012-05-23 23:28:42

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

le programme d'Installation de votre Tableau Associatif de la classe

/**
 * @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);
14
répondu Ally 2013-08-02 09:01:07

Pour certains cas, il est préférable de stocker la taille dans une variable distincte. En particulier, si vous ajoutez au tableau par un élément dans un endroit et peut facilement augmenter la taille. Il serait évidemment travailler beaucoup plus rapidement si vous avez besoin de vérifier la taille souvent.

13
répondu Jānis Elmeris 2011-07-29 13:41:54

utiliser:

var myArray = new Object();
myArray["firstname"] = "Gareth";
myArray["lastname"] = "Simpson";
myArray["age"] = 21;
obj = Object.keys(myArray).length;
console.log(obj)
13
répondu Mahendra Kulkarni 2016-09-17 18:36:54

utilisez simplement ceci pour obtenir le length :

Object.keys(myObject).length
12
répondu saurabhgoyal795 2018-04-04 08:27:18

@palmsey: pour être honnête avec L'OP, les docs javascript font explicitement référence à l'utilisation de variables d'objet de type de cette manière comme des "tableaux associatifs".

et en toute justice pour @palmsey il avait tout à fait raison, ce ne sont pas des tableaux associatifs, ce sont certainement des objets :) - faire le travail d'un tableau associatif. Mais en ce qui concerne le point plus large vous semblez certainement avoir le droit de celui-ci selon cet article plutôt beau que j'ai trouvé:

JavaScript "Tableaux Associatifs", Jugée Dangereuse

mais selon tout cela, n'est-ce pas la réponse acceptée elle-même mauvaise pratique?

spécifier une fonction prototype de taille () pour L'objet

Si autre chose a été ajouté à L'objet .prototype, puis le le code suggéré échouera:

<script type="text/javascript">
Object.prototype.size = function () {
  var len = this.length ? --this.length : -1;
    for (var k in this)
      len++;
  return len;
}
Object.prototype.size2 = function () {
  var len = this.length ? --this.length : -1;
    for (var k in this)
      len++;
  return len;
}
var myArray = new Object();
myArray["firstname"] = "Gareth";
myArray["lastname"] = "Simpson";
myArray["age"] = 21;
alert("age is " + myArray["age"]);
alert("length is " + myArray.size());
</script>

Je ne pense pas que cette réponse devrait être la réponse acceptée car on ne peut pas lui faire confiance si vous avez un autre code exécuté dans le même contexte d'exécution. Pour le faire d'une manière robuste sûrement vous auriez besoin de définir la méthode de taille dans myArray et vérifier le type des membres que vous itérez à travers eux.

11
répondu Polsonby 2017-05-23 12:34:58

Le plus simple est Objet.les touches(monobjet).longueur

10
répondu Tamesh 2018-06-21 02:25:54

Qu'en est-il de quelque chose comme ça ...

function keyValuePairs() {
    this.length = 0;
    function add(key, value) { this[key] = value; this.length++; }
    function remove(key) { if (this.hasOwnProperty(key)) { delete this[key]; this.length--; }}
}
9
répondu Jerry 2011-08-24 14:26:28

si nous avons le hash

hash = {"a" : "b", "c":" d"};

nous pouvons obtenir la longueur en utilisant la longueur des touches qui est la longueur du hachage:

clés de hachage).longueur

9
répondu abo-elleef 2016-09-17 18:28:53

si vous utilisez AngularJS 1.x vous pouvez faire les choses à la façon AngularJS en créant un filtre et en utilisant le code de l'un des autres exemples tels que le suivant:

// Count the elements in an object
app.filter('lengthOfObject', function() {
  return function( obj ) {
    var size = 0, key;
    for (key in obj) {
      if (obj.hasOwnProperty(key)) size++;
    }
   return size;
 }
})

Utilisation

dans votre contrôleur:

$scope.filterResult = $filter('lengthOfObject')($scope.object)

Ou dans votre point de vue:

<any ng-expression="object | lengthOfObject"></any>
9
répondu pcnate 2016-09-17 18:33:46

si vous avez besoin d'une structure de données associative qui expose sa taille, mieux vaut utiliser une carte au lieu d'un objet.

var myMap = new Map();
myMap.set("firstname", "Gareth");
myMap.set("lastname", "Simpson");
myMap.set("age", 21);
myMap.size; // 3
7
répondu Oriol 2016-05-18 18:16:07

une variante de ce qui précède est:

var objLength = function(obj){    
    var key,len=0;
    for(key in obj){
        len += Number( obj.hasOwnProperty(key) );
    }
    return len;
};

c'est une façon un peu plus élégante d'intégrer hasOwnProp.

6
répondu wade harrell 2014-10-07 10:54:43

si vous ne vous souciez pas de supporter Internet Explorer 8 ou moins, vous pouvez facilement obtenir le nombre de propriétés dans un objet en appliquant les deux étapes suivantes:

  1. Exécuter Object.keys() pour obtenir un tableau qui contient les noms des uniquement les propriétés qui sont énumérable ou Object.getOwnPropertyNames() si vous voulez inclure les noms de propriétés qui ne sont pas énumérable.
  2. obtenir le .length propriété de ce tableau.

si vous avez besoin de faire cela plus d'une fois, vous pouvez envelopper cette logique dans une fonction:

function size(obj, enumerablesOnly) {
    return enumerablesOnly === false ?
        Object.getOwnPropertyNames(obj).length :
        Object.keys(obj).length;
}

Comment utiliser cette fonction particulière:

var myObj = Object.create({}, {
    getFoo: {},
    setFoo: {}
});
myObj.Foo = 12;

var myArr = [1,2,5,4,8,15];

console.log(size(myObj));        // Output : 1
console.log(size(myObj, true));  // Output : 1
console.log(size(myObj, false)); // Output : 3
console.log(size(myArr));        // Output : 6
console.log(size(myArr, true));  // Output : 6
console.log(size(myArr, false)); // Output : 7

voir aussi ce Violon pour une démo.

6
répondu John Slegers 2016-09-18 00:19:08

ça marche pour moi:

var size = Object.keys(myObj).length;
6
répondu Giovanni Gianni 2018-06-06 09:34:40

Voici une version différente de la réponse de James Cogan. Au lieu de passer un argument, il suffit de prototyper la classe D'objet et de rendre le code plus propre.

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

var x = {
    one: 1,
    two: 2,
    three: 3
};

x.size() === 3;

exemple de jsfiddle: http://jsfiddle.net/qar4j/1 /

5
répondu Sherzod 2013-06-26 23:47:45

, Vous pouvez simplement utiliser Object.keys(obj).length sur n'importe quel objet pour obtenir sa longueur. Objet.keys retourne un tableau contenant tout l'objet keys (propriétés) qui peut être pratique pour trouver la longueur de cet objet en utilisant la longueur du tableau correspondant. Vous pouvez même écrire une fonction pour cela. Nous allons obtenir créatif et écrire une méthode pour elle aussi bien (avec un getter plus convivial de la propriété):

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

console.log(objLength({a:1, b:"summit", c:"nonsense"}));

// Works perfectly fine
var obj = new Object();
obj['fish'] = 30;
obj['nullified content'] = null;
console.log(objLength(obj));

// It also works your way, which is creating it using the Object constructor
Object.prototype.getLength = function() {
   return Object.keys(this).length;
}
console.log(obj.getLength());

// You can also write it as a method, which is more efficient as done so above

Object.defineProperty(Object.prototype, "length", {get:function(){
    return Object.keys(this).length;
}});
console.log(obj.length);

// probably the most effictive approach is done so and demonstrated above which sets a getter property called "length" for objects which returns the equivalent value of getLength(this) or this.getLength()
4
répondu WEB_UI 2016-10-12 02:09:14

la manière la plus simple est comme ceci

Object.keys(myobject).length

où myobject est l'objet de ce que vous voulez la longueur

4
répondu Mithu A Quayium 2018-05-30 15:41:40

Vous pouvez toujours faire Object.getOwnPropertyNames(myObject).length pour obtenir le même résultat que [].length donnez tableau normal.

3
répondu Pian0_M4n 2017-09-27 09:05:26
var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
  1. objet.valeurs(monobjet).longueur
  2. objet.entrées(monobjet).longueur
  3. objet.les touches(monobjet).longueur
3
répondu tdjprog 2018-04-05 23:45:02

ci-dessous est une version de la réponse de James Coglan en CoffeeScript pour ceux qui ont abandonné JavaScript droit:)

Object.size = (obj) ->
  size = 0
  size++ for own key of obj
  size
2
répondu Eric Anderson 2014-10-06 19:44:08

biens

Object.defineProperty(Object.prototype, 'length', {
    get: function () {
        var size = 0, key;
        for (key in this)
            if (this.hasOwnProperty(key))
                size++;
        return size;
    }
});

Utiliser

var o = {a: 1, b: 2, c: 3};
alert(o.length); // <-- 3
o['foo'] = 123;
alert(o.length); // <-- 4
2
répondu Eduardo Cuomo 2015-01-06 19:10:35

comme la plupart des problèmes JavaScript, il y a plusieurs solutions. Vous pouvez étendre L'objet que pour le meilleur ou le pire fonctionne comme beaucoup D'autres langues du dictionnaire (+ citoyens de première classe). Rien de mal à cela, mais une autre option est de construire un nouvel Objet qui répond à vos besoins spécifiques.

function uberject(obj){
    this._count = 0;
    for(var param in obj){
        this[param] = obj[param];
        this._count++;
    }
}

uberject.prototype.getLength = function(){
    return this._count;
};

var foo = new uberject({bar:123,baz:456});
alert(foo.getLength());
2
répondu Ron Sims II 2016-11-19 06:27:26