Obtention de la liste des clés d'objets JavaScript


295

J'ai un objet JavaScript comme

var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}

Comment obtenir la longueur et la liste des clés de cet objet?



@TJ Je pense que ce n'est pas totalement pareil. Il s'agit d'un objet, le doublon est un objet JSON.
GuyT

si vous avez souligné, alors simplement _.keys (your_object)
minhajul

1
Comme les choses ont changé depuis 2010, il pourrait être préférable d'accepter la réponse la plus votée comme "la réponse"
Jonas Wilms

Réponses:


341

var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
};
var keys = [];

for (var k in obj) keys.push(k);

alert("total " + keys.length + " keys: " + keys);


Je ne suppose pas que Javascript est comme PHP, où vous pouvez sauter la première ligne complètement? Pas que quelque chose comme ça soit conseillé de toute façon.
Bart van Heukelom

@Bart: Non, la première ligne est nécessaire en JavaScript.
Daniel Vassallo

6
Vous devriez jeter un oeil au commentaire de David Morrissey ci-dessous pour un cas de bord ici. Parfois, cette approche entraînera l'apparition de membres indésirables du prototype keys.

2
@pat: Si vous utilisez des littéraux d'objet, cela ne se produira que si vous étendez Object.prototype, ce que vous ne devriez pas faire de toute façon. Pour les constructeurs personnalisés, cependant, vous avez raison.
Sasha Chedygov

@BartvanHeukelom, même en juin 2010, qui a provoqué une notification, car cela signifie que vous tapez implicitement l'objet. L'attribution [](ou array()à l'époque) en fait un tableau, que vous pouvez ensuite utiliser en tant que tableau en toute sécurité.
Niels Keurentjes

627

var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}
var keys = Object.keys(obj);
console.log('obj contains ' + keys.length + ' keys: '+  keys);

Il est désormais pris en charge sur la plupart des principaux navigateurs.


7
Le fait qu'il fonctionne dans Chrome signifie également qu'il fonctionne dans Node.js car les deux sont construits sur le moteur javascript V8.
Homme Zwaagstra

9
@fet De nos jours, oui. Il y a deux ans, pas tellement.
AlbertEngelB

4
Notez que c'est différent de for(key in ob)! Object.keysne listera pas les clés des prototypes, mais le .. in objfait.
Albert

9
@fet windows7 est venu avec IE8. Aussi génial que ce soit, il n'y a aucun moyen que cela puisse être la réponse acceptée jusqu'à ce que les gens cessent d'utiliser IE8.
blottit

1
Ici developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… vous trouvez une méthode JavaScript qui fonctionne correctement dans les anciens navigateurs et n'écrase pas la fonctionnalité dans les navigateurs plus récents. Voir également ma réponse ci-dessous.
Sandro

27

Underscore.js rend la transformation assez propre:

var keys = _.map(x, function(v, k) { return k; });

Edit: j'ai manqué que vous puissiez faire cela aussi:

var keys = _.keys(x);

C'est exact, la source de soulignement réelle: nativeKeys = Object.keys; hasOwnProperty = ObjProto.hasOwnProperty; .has = function (obj, key) {return hasOwnProperty.call (obj, key); }; _.keys = nativeKeys || function (obj) {if (obj! == Object (obj)) throw new TypeError ('Invalid object'); var keys = []; for (var key in obj) if ( .has (obj, key)) keys.push (key); clés de retour; };
Miguel Alejandro Fuentes Lopez

18

Si vous souhaitez uniquement les clés spécifiques à cet objet particulier et non les prototypepropriétés dérivées :

function getKeys(obj) {
    var r = []
    for (var k in obj) {
        if (!obj.hasOwnProperty(k)) 
            continue
        r.push(k)
    }
    return r
}

par exemple:

var keys = getKeys({'eggs': null, 'spam': true})
var length = keys.length // access the `length` property as usual for arrays

4
var keys = new Array();
for(var key in obj)
{
   keys[keys.length] = key;
}

var keyLength = keys.length;

pour accéder à n'importe quelle valeur de l'objet, vous pouvez utiliser obj [clé];


vous devez incrémenter l'index du tableau
Vivek

L'index du tableau est incrémenté automatiquement de keys.length, ce qui est différent pour chaque itération à mesure que chaque itération insère une valeur.
KrekkieD

4
obj = {'a':'c','b':'d'}

Tu peux essayer:

[index for (index in obj)] 

cela reviendra:

['a','b']

pour obtenir la liste des clés ou

[obj[index] for (index in obj)]

pour obtenir les valeurs


Ne fonctionne pas dans Google Chrome v16.0.912.75, mais il fonctionne dans Firefox v10.0
RobM

4

La réponse d'Anurags est fondamentalement correcte. Mais pour prendre Object.keys(obj)en charge les anciens navigateurs, vous pouvez également utiliser le code ci-dessous qui est copié à partir de https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys . Il ajoute la Object.keys(obj)méthode si elle n'est pas disponible depuis le navigateur.

if (!Object.keys) {
 Object.keys = (function() {
 'use strict';
 var hasOwnProperty = Object.prototype.hasOwnProperty,
    hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),
    dontEnums = [
      'toString',
      'toLocaleString',
      'valueOf',
      'hasOwnProperty',
      'isPrototypeOf',
      'propertyIsEnumerable',
      'constructor'
    ],
    dontEnumsLength = dontEnums.length;

return function(obj) {
  if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {
    throw new TypeError('Object.keys called on non-object');
  }

  var result = [], prop, i;

  for (prop in obj) {
    if (hasOwnProperty.call(obj, prop)) {
      result.push(prop);
    }
  }

  if (hasDontEnumBug) {
    for (i = 0; i < dontEnumsLength; i++) {
      if (hasOwnProperty.call(obj, dontEnums[i])) {
        result.push(dontEnums[i]);
      }
    }
  }
  return result;
};
}());
}

3

Notez que dans coffeescript cela peut être accompli dans tous les navigateurs et nœuds comme

k for k of obj

Et ainsi

(1 for _ of obj).length

3

Solution récursive pour les navigateurs prenant en charge ECMAScript 5:

var getObjectKeys = function(obj) {
    var keys = Object.keys(obj);
    var length = keys.length;

    if (length !== 0) {
        for (var i = 0; i < length; i++) {
            if (typeof obj[keys[i]] === 'object') {
                keys[keys[i]] = getObjectKeys(obj[keys[i]]);
            }
        }
    }

    return keys;
};

3
var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}

console.log(Object.keys(obj));
console.log(Object.keys(obj).length)


3

Si vous décidez d'utiliser Underscore.js, vous feriez mieux de le faire

var obj = {
    key1: 'value1',
    key2: 'value2',
    key3: 'value3',
    key4: 'value4'
}

var keys = [];
_.each( obj, function( val, key ) {
    keys.push(key);
});
console.log(keys.lenth, keys);

3

En JavaScript, un objet est une entité autonome, avec des propriétés et un type.

Pour récupérer des valeurs depuis Object sous forme de tableau: Object .values ​​(obj) // obj est le nom d'objet que vous avez utilisé Résultat -> ["valeur1", "valeur2", "valeur3", "valeur4"]

Pour récupérer les clés de l'objet sous forme de tableau: Object .keys (obj) // obj est le nom de l'objet que vous avez utilisé Résultat -> ["key1", "key2", "key3", "key4"]

Comme les deux fonctions renvoient un tableau, vous pouvez obtenir la longueur des clés ou la valeur en utilisant la propriété length. Par exemple - Object .values ​​(obj) .length ou Object .keys (obj) .length


2

Pour une chaîne délimitée par des virgules répertoriant les clés d'un objet JSON, essayez ce qui suit:

function listKeys(jObj){
    var keyString = '';
    for(var k in jObj){
        keyString+=(','+k);
    }
    return keyString.slice(1);
}



/* listKeys({'a' : 'foo', 'b' : 'foo', 'c' : 'foo'}) -> 'a,b,c' */

2

À l'aide d'ES6, vous pouvez utiliser forEachpour parcourir les clés d'un objet. Pour obtenir toutes les clés, vous pouvez utiliser Object.keysqui renvoie toutes les clés d'un objet

Object.keys(obj).forEach(function(keyValue, index, map) { 
  console.log(keyValue); 
});

La main courte de l'extrait ci-dessus serait, qui ne prend qu'un seul paramètre

Object.keys(obj).forEach(function(keyValue) { 
  console.log(keyValue); 
});

1
       if(props.userType){
          var data = []
          Object.keys(props.userType).map(i=>{
                data.push(props.userType[i])
          })
          setService(data)
        }

0

en utilisant la méthode slice, apply et join.

var print = Array.prototype.slice.apply( obj );
alert('length='+print.length+' list'+print.join());
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.