Obtendo a lista de chaves do objeto JavaScript


295

Eu tenho um objeto JavaScript como

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

Como posso obter o comprimento e a lista de chaves neste objeto?



@TJ Eu acho que não é totalmente o mesmo. Este é um objeto, a duplicata é um objeto JSON.
Guyt

se você tem sublinhado, em seguida, basta _.keys (your_object)
minhajul

1
Como as coisas mudaram desde 2010, talvez seja melhor para aceitar a resposta mais upvoted como "a resposta"
Jonas Wilms

Respostas:


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


Suponho que o Javascript não seja como o PHP, onde você pode pular a primeira linha completamente? Não que algo assim seja aconselhável fazer de qualquer maneira.
Bart van Heukelom 18/06/10

@ Bart: Não, a primeira linha é necessária em JavaScript.
precisa

6
Você deve dar uma olhada no comentário de David Morrissey abaixo para obter um exemplo de caso aqui. Às vezes, adotar essa abordagem resultará na exibição de membros indesejados do protótipo keys.

2
@pat: se você estiver usando literais de objetos, isso só acontecerá se você estender Object.prototype, o que você não deveria fazer de qualquer maneira. Para construtores personalizados, no entanto, você está certo.
Sasha Chedygov 23/10/10

@BartvanHeukelom, mesmo em junho de 2010, que causou um aviso, pois significa que você está digitando implicitamente o objeto. Atribuir []a ele (ou array()então) torna um array, que você pode usar como um array com segurança.
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);

É suportado na maioria dos principais navegadores agora.


7
O fato de funcionar no Chrome também significa que funciona no Node.js, pois ambos são criados no mecanismo javascript V8.
Homme Zwaagstra

9
@fet Atualmente, sim. Dois anos atrás, nem tanto.
AlbertEngelB

4
Observe que isso é diferente de for(key in ob)! Object.keysnão listará as chaves dos protótipos, mas .. in objsim.
Albert

9
@ windows7 veio com o IE8. Por melhor que fosse, não há como essa seja a resposta aceita até que as pessoas parem de usar o IE8.
aconchega

1
Aqui, developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…, você encontra um método JavaScript que funciona corretamente em navegadores antigos e não substitui a funcionalidade em navegadores mais recentes. Veja também minha resposta abaixo.
Sandro

27

O Underscore.js torna a transformação bastante limpa:

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

Edit: Eu perdi que você também pode fazer isso:

var keys = _.keys(x);

Está correto, a verdadeira fonte de sublinhado: nativeKeys = Object.keys; hasOwnProperty = ObjProto.hasOwnProperty; .has = função (obj, chave) {return hasOwnProperty.call (obj, chave); }; _.keys = nativeKeys || function (obj) {if (obj! == Object (obj)) lança novo TypeError ('objeto inválido'); chaves var = []; for (var key in obj) if ( .has (obj, key)) keys.push (chave); retornar chaves; };
Miguel Alejandro Fuentes Lopez

18

Se você deseja apenas as chaves específicas para esse objeto específico e não quaisquer prototypepropriedades derivadas :

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

por exemplo:

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 acessar qualquer valor do objeto, você pode usar obj [key];


você precisa índice da matriz de incremento
Vivek

O índice da matriz é incrementado automaticamente por keys.length, o que é diferente para cada iteração, pois cada iteração insere um valor.
KrekkieD

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

Podes tentar:

[index for (index in obj)] 

isso retornará:

['a','b']

para obter a lista de chaves ou

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

para obter os valores


Não funciona no Google Chrome v16.0.912.75, mas funciona no Firefox v10.0
RobM

4

A resposta de Anurags está basicamente correta. Mas também para oferecer suporte a Object.keys(obj)navegadores mais antigos, você pode usar o código abaixo copiado de https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys . Ele adiciona o Object.keys(obj)método se não estiver disponível no 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

Observe que no coffeescript isso pode ser realizado em todos os navegadores e nós como

k for k of obj

e assim

(1 for _ of obj).length

3

Solução recursiva para navegadores que suportam 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 você decidir usar o Underscore.js, é melhor fazer

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

Em JavaScript, um objeto é uma entidade independente, com propriedades e tipo.

Para buscar valores de Object na forma de matriz: Object .values ​​(obj) // obj é o nome do objeto que você usou Resultado -> ["value1", "value2", "value3", "value4"]

Para buscar chaves de Object na forma de matriz: Object .keys (obj) // obj é o nome do objeto que você usou Resultado -> ["key1", "key2", "key3", "key4"]

Como ambas as funções estão retornando matriz, você pode obter o comprimento das chaves ou do valor usando a propriedade length. Por exemplo - Object .values ​​(obj) .length ou Object .keys (obj) .length


2

Para uma cadeia delimitada por vírgula, listando as chaves de um Objeto JSON, tente o seguinte:

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 o ES6, você pode usar forEachpara iterar sobre as Chaves de um Objeto. Para obter todas as chaves, você pode usar o Object.keysque retorna todas as chaves em um Objeto

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

Seria a mão curta do snippet acima, que requer apenas um 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 fatia, aplique e junte o método.

var print = Array.prototype.slice.apply( obj );
alert('length='+print.length+' list'+print.join());
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.