Obtener la lista de claves de objetos de JavaScript

295

Tengo un objeto JavaScript como

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

¿Cómo puedo obtener la longitud y la lista de claves en este objeto?

usuario160820
fuente
@TJ Creo que no es totalmente lo mismo. Este es un objeto, el duplicado es un objeto JSON.
GuyT
si tiene guión bajo, simplemente _.keys (su_objeto)
minhajul
1
Como las cosas han cambiado desde 2010, podría ser mejor aceptar la respuesta más votada como "la respuesta"
Jonas Wilms

Respuestas:

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

zed_0xff
fuente
No creo que Javascript sea como PHP, ¿dónde puedes saltarte la primera línea por completo? No es que algo así sea recomendable hacer de todos modos.
Bart van Heukelom
@Bart: No, la primera línea es necesaria en JavaScript.
Daniel Vassallo
66
Deberías echar un vistazo al comentario de David Morrissey a continuación para ver un caso de borde aquí. A veces, adoptar este enfoque dará como resultado que aparezcan miembros no deseados del prototipo keys.
2
@pat: si está utilizando literales de objeto, eso solo sucederá si extiende Object.prototype, lo que no debería hacer de todos modos. Para los constructores personalizados, sin embargo, tienes razón.
Sasha Chedygov
@BartvanHeukelom, incluso en junio de 2010, causó un aviso, ya que significa que está escribiendo implícitamente el objeto. Asignarlo [](o en array()aquel entonces) lo convierte en una matriz, que luego puede usar como una matriz de forma segura.
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);

Es compatible con la mayoría de los principales navegadores ahora.

Anurag
fuente
77
El hecho de que funcione en Chrome también significa que funciona en Node.js ya que ambos están construidos en el motor JavaScript V8.
Homme Zwaagstra
99
@fet Hoy en día, sí. Hace dos años, no tanto.
AlbertEngelB
44
Tenga en cuenta que esto es diferente de for(key in ob)! Object.keysNo enumera las claves de los prototipos, pero lo .. in objhace.
Albert
99
@fet windows7 vino con IE8. Por grandioso que sea, no hay forma de que esta sea la respuesta aceptada hasta que la gente deje de usar IE8.
acurruca
1
Aquí developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… encontrará un método de JavaScript que funciona correctamente en los navegadores antiguos y no sobrescribe la funcionalidad en los navegadores más nuevos. También vea mi respuesta a continuación.
Sandro
27

Underscore.js hace que la transformación sea bastante limpia:

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

Editar: Extrañé que tú también puedas hacer esto:

var keys = _.keys(x);
Mikebridge
fuente
Eso es correcto, la fuente real de subrayado: 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 ('Objeto inválido'); teclas var = []; for (var key en obj) if ( .has (obj, key)) keys.push (key); teclas de retorno; };
Miguel Alejandro Fuentes López
18

Si solo desea las claves que son específicas de ese objeto en particular y no las prototypepropiedades derivadas :

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

p.ej:

var keys = getKeys({'eggs': null, 'spam': true})
var length = keys.length // access the `length` property as usual for arrays
cryo
fuente
4
var keys = new Array();
for(var key in obj)
{
   keys[keys.length] = key;
}

var keyLength = keys.length;

para acceder a cualquier valor del objeto, puede usar obj [clave];

Mohan Gundlapalli
fuente
lo que necesita índice de la matriz de la subasta
Vivek
El índice de matriz se incrementa automáticamente en keys.length, lo cual es diferente para cada iteración ya que cada iteración inserta un valor.
KrekkieD
4
obj = {'a':'c','b':'d'}

Puedes probar:

[index for (index in obj)] 

esto devolverá:

['a','b']

para obtener la lista de claves o

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

para obtener los valores

Jim Nolan
fuente
No funciona en Google Chrome v16.0.912.75, pero funciona en Firefox v10.0
RobM
4

La respuesta de Anurags es básicamente correcta. Pero para admitir también Object.keys(obj)en navegadores antiguos, puede usar el siguiente código que se copia de https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys . Agrega el Object.keys(obj)método si no está disponible desde el navegador.

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;
};
}());
}
Sandro
fuente
3

Tenga en cuenta que en coffeescript esto se puede lograr en todos los navegadores y nodos como

k for k of obj

y por lo tanto

(1 for _ of obj).length
Tim James
fuente
3

Solución recursiva para navegadores que admiten 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;
};
Jordi
fuente
3
var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}

console.log(Object.keys(obj));
console.log(Object.keys(obj).length)
bajran
fuente
3

Si decides usar Underscore.js, será mejor que lo hagas

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);
mohammad javad ahmadi
fuente
3

En JavaScript, un objeto es una entidad independiente, con propiedades y tipo.

Para obtener valores del objeto en forma de matriz: Object .values ​​(obj) // obj es el nombre del objeto que utilizó Resultado -> ["value1", "value2", "value3", "value4"]

Para obtener claves del objeto en forma de matriz: Object .keys (obj) // obj es el nombre del objeto que utilizó Resultado -> ["clave1", "clave2", "clave3", "clave4"]

Como ambas funciones devuelven una matriz, puede obtener la longitud de las claves o el valor utilizando la propiedad de longitud. Por ejemplo: Object .values ​​(obj) .length u Object .keys (obj) .length

Rakesh Soni
fuente
2

Para una cadena delimitada por comas que enumera las claves de un objeto JSON, intente lo siguiente:

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' */
cristiano
fuente
2

Usando ES6, puedes usar forEach para iterar sobre las claves de un objeto. Para obtener todas las claves que puede usar, Object.keysque devuelve todas las claves en un objeto

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

Sería breve el fragmento anterior, que solo toma un parámetro

Object.keys(obj).forEach(function(keyValue) { 
  console.log(keyValue); 
});
Rinav
fuente
1
       if(props.userType){
          var data = []
          Object.keys(props.userType).map(i=>{
                data.push(props.userType[i])
          })
          setService(data)
        }
Prathamesh Sawant
fuente
0

usando el método de cortar, aplicar y unir.

var print = Array.prototype.slice.apply( obj );
alert('length='+print.length+' list'+print.join());

fuente