Ottenere l'elenco delle chiavi degli oggetti JavaScript


295

Ho un oggetto JavaScript come

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

Come posso ottenere la lunghezza e l'elenco delle chiavi in ​​questo oggetto?



@TJ Penso che non sia del tutto uguale. Questo è un oggetto, il duplicato è un oggetto JSON.
GuyT,

se hai un trattino basso, allora semplicemente _.keys (your_object)
minhajul

1
Poiché le cose sono cambiate dal 2010, potrebbe essere meglio accettare la risposta più votata come "la risposta"
Jonas Wilms,

Risposte:


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


Suppongo che Javascript non sia come PHP, dove puoi saltare del tutto la prima riga? Non che una cosa del genere sia consigliabile fare comunque.
Bart van Heukelom,

@Bart: No, la prima riga è necessaria in JavaScript.
Daniel Vassallo,

6
Dovresti dare un'occhiata al commento di David Morrissey qui sotto per un caso limite qui. A volte questo approccio comporterà la comparsa di membri indesiderati del prototipo keys.

2
@pat: se stai usando oggetti letterali, ciò accadrà solo se estendi Object.prototype, cosa che non dovresti comunque fare. Per i costruttori personalizzati, tuttavia, hai ragione.
Sasha Chedygov,

@BartvanHeukelom anche nel giugno 2010 ha causato un avviso, poiché significa che stai digitando implicitamente l'oggetto. L'assegnazione []ad esso (o array()allora) lo rende un array, che può quindi essere utilizzato come array in modo sicuro.
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);

Ora è supportato sulla maggior parte dei principali browser.


7
Il fatto che funzioni in Chrome significa anche che funziona in Node.js poiché entrambi sono basati sul motore javascript V8.
Homme Zwaagstra,

9
@fet Oggi sì. Due anni fa, non così tanto.
AlbertEngelB,

4
Nota che questo è diverso da for(key in ob)! Object.keysnon elencherà le chiavi dei prototipi, ma .. in objnon lo fa.
Albert

9
@fet windows7 è arrivato con IE8. Per quanto sia bello, non c'è modo che questa possa essere la risposta accettata fino a quando le persone non smetteranno di usare IE8.
coccole

1
Qui developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… trovi un metodo JavaScript che funziona correttamente nei vecchi browser e non sovrascrive le funzionalità nei browser più recenti. Vedi anche la mia risposta qui sotto.
Sandro,

27

Underscore.js rende la trasformazione abbastanza pulita:

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

Modifica: mi sono perso anche tu puoi fare questo:

var keys = _.keys(x);

È corretto, la fonte di sottolineatura effettiva: nativeKeys = Object.keys; hasOwnProperty = ObjProto.hasOwnProperty; .has = function (obj, key) {return hasOwnProperty.call (obj, key); }; _.keys = nativeKeys || function (obj) {if (obj! == Object (obj)) lancia new TypeError ('Oggetto non valido'); var keys = []; for (var key in obj) if ( .has (obj, key)) keys.push (key); chiavi di ritorno; };
Miguel Alejandro Fuentes Lopez,

18

Se si desidera solo le chiavi specifiche per quel particolare oggetto e non le prototypeproprietà derivate :

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

per esempio:

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;

per accedere a qualsiasi valore dall'oggetto, puoi usare obj [chiave];


è necessario incrementare l'indice di array
Vivek

l'indice di array viene incrementato automaticamente di keys.length, che è diverso per ogni iterazione poiché ogni iterazione inserisce un valore.
KrekkieD,

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

Puoi provare:

[index for (index in obj)] 

questo restituirà:

['a','b']

per ottenere l'elenco delle chiavi o

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

per ottenere i valori


Non funziona in Google Chrome v16.0.912.75, ma funziona in Firefox v10.0
RobM

4

La risposta di Anurags è sostanzialmente corretta. Ma per supportare anche Object.keys(obj)nei browser meno recenti è possibile utilizzare il codice riportato di seguito che viene copiato da https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys . Aggiunge il Object.keys(obj)metodo se non è disponibile dal browser.

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

Si noti che in coffeescript questo può essere realizzato in tutti i browser e nodi come

k for k of obj

e quindi

(1 for _ of obj).length

3

Soluzione ricorsiva per browser che supportano 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

Se decidi di utilizzare Underscore.js è meglio farlo

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

In JavaScript, un oggetto è un'entità autonoma, con proprietà e tipo.

Per recuperare i valori da Object sotto forma di array: Object .values ​​(obj) // obj è il nome oggetto che hai usato Risultato -> ["valore1", "valore2", "valore3", "valore4"]

Per recuperare le chiavi dall'oggetto sotto forma di array: Object .keys (obj) // obj è il nome dell'oggetto che hai usato Risultato -> ["key1", "key2", "key3", "key4"]

Poiché entrambe le funzioni restituiscono un array, è possibile ottenere la lunghezza delle chiavi o del valore utilizzando la proprietà length. Ad esempio: Object .values ​​(obj) .length o Object .keys (obj) .length


2

Per una stringa delimitata da virgole che elenca le chiavi di un oggetto JSON, provare quanto segue:

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

Utilizzando ES6, è possibile utilizzare forEachper scorrere le chiavi di un oggetto. Per ottenere tutte le chiavi è possibile utilizzare Object.keysche restituisce tutte le chiavi in ​​un oggetto

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

La mano breve dello snippet sopra sarebbe, che accetta solo un parametro

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

usando il metodo slice, apply e join.

var print = Array.prototype.slice.apply( obj );
alert('length='+print.length+' list'+print.join());
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.