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?



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


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.


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

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

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


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


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

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

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

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

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


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

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


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' */

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

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

0

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

var print = Array.prototype.slice.apply( obj );
alert('length='+print.length+' list'+print.join());
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.