javascript - value - Como encontrar chaves de um hash?




pegar chave array javascript (6)

Eu sei em javascript objetos duplas como hashes, mas eu tenho sido incapaz de encontrar uma função incorporada para obter as chaves

var h = {a:'b',c:'d'};

Eu quero algo parecido

var k = h.keys() ; // k = ['a','c'];

É simples escrever uma função para iterar os itens e adicionar as chaves a um array que eu retorne, mas existe uma maneira mais limpa e padrão de fazer isso?

Eu continuo sentindo que deve ser um simples construído na função que eu perdi, mas não consigo encontrá-lo!


Eu acredito que você pode percorrer as propriedades do objeto usando para / in, então você poderia fazer algo assim:

function getKeys(h) {
  Array keys = new Array();
  for (var key in h)
    keys.push(key);
  return keys;
}

Eu queria usar a melhor resposta acima

Object.prototype.keys = function () ...

No entanto, quando usado em conjunto com o google maps API v3, o google maps não é funcional.

for (var key in h) ...

funciona bem.


Isso é o melhor que você pode fazer, até onde eu sei ...

var keys = [];
for (var k in h)keys.push(k);

Para o código de produção que requer uma grande compatibilidade com navegadores clientes, eu ainda sugiro a resposta de Ivan Nevostruev acima com shim para garantir que as Object.keys em navegadores mais antigos. No entanto, é possível obter a funcionalidade exata solicitada usando o novo recurso defineProperty do ECMA.

A partir do ECMAScript 5 - Object.defineProperty

A partir do ECMA5, você pode usar Object.defineProperty() para definir propriedades não enumeráveis. A compatibilidade atual ainda tem muito a desejar, mas isso deve se tornar utilizável em todos os navegadores. (Observe especificamente a incompatibilidade atual com o IE8!)

Object.defineProperty(Object.prototype, 'keys', {
  value: function keys() {
    var keys = [];
    for(var i in this) if (this.hasOwnProperty(i)) {
      keys.push(i);
    }
    return keys;
  },
  enumerable: false
});

var o = {
    'a': 1,
    'b': 2
}

for (var k in o) {
    console.log(k, o[k])
}

console.log(o.keys())

# OUTPUT
# > a 1
# > b 2
# > ["a", "b"]

No entanto, como o ECMA5 já adicionou Object.keys você também pode usar:

Object.defineProperty(Object.prototype, 'keys', {
  value: function keys() {
    return Object.keys(this);
  },
  enumerable: false
});

Resposta original

Object.prototype.keys = function ()
{
  var keys = [];
  for(var i in this) if (this.hasOwnProperty(i))
  {
    keys.push(i);
  }
  return keys;
}

Edit: Uma vez que esta resposta tem sido em torno de um tempo eu vou deixar o acima intocado. Quem ler isso também deve ler a resposta de Ivan Nevostruev abaixo.

Não há como fazer funções de protótipo não enumeráveis, o que faz com que elas sempre hasOwnProperty em loops for-in que não usam hasOwnProperty . Eu ainda acho que essa resposta seria ideal se estender o protótipo de Object não fosse tão confuso.


Usando o jQuery você pode obter as chaves assim:

var bobject =  {primary:"red",bg:"maroon",hilite:"green"};
var keys = [];
$.each(bobject, function(key,val){ keys.push(key); });
console.log(keys); // ["primary", "bg", "hilite"]

Ou:

var bobject =  {primary:"red",bg:"maroon",hilite:"green"};
$.map(bobject, function(v,k){return k;});

obrigado a @pimlottc


Você poderia usar Underscore.js , que é uma biblioteca de utilitários Javascript.

_.keys({one : 1, two : 2, three : 3}); 
// => ["one", "two", "three"]




key