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?

user160820
fonte
possível duplicata de obter nomes de Propriedade Em JSON Objetos
TJ
@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);

zed_0xff
fonte
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.

Anurag
fonte
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);
Mikebridge
fonte
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
crio
fonte
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];

Mohan Gundlapalli
fonte
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

Jim Nolan
fonte
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;
};
}());
}
Sandro
fonte
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
Tim James
fonte
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;
};
Jordi
fonte
3
var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}

console.log(Object.keys(obj));
console.log(Object.keys(obj).length)
Bajran
fonte
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);
mohammad javad ahmadi
fonte
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

Rakesh Soni
fonte
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' */
cristão
fonte
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); 
});
Rinav
fonte
1
       if(props.userType){
          var data = []
          Object.keys(props.userType).map(i=>{
                data.push(props.userType[i])
          })
          setService(data)
        }
Prathamesh Sawant
fonte
0

usando fatia, aplique e junte o método.

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

fonte