melhor maneira de obter a chave de um objeto javascript key / value

186

Se eu tiver um objeto JS como:

var foo = { 'bar' : 'baz' }

Se eu sei que foopossui essa estrutura básica de chave / valor, mas não sei o nome da chave, qual é a maneira mais fácil de obtê-la? for ... in? $.each()? Espero que haja algo melhor ....

sprugman
fonte
5
o que há de errado com ... em?
Matt
1
Parece indireto e você precisa usar o hasOwnProperty. Acho que vou fazer uma função de biblioteca que faz isso ....
sprugman

Respostas:

93

Se você deseja obter todas as chaves, introduziu o ECMAScript 5Object.keys . Isso é suportado apenas por navegadores mais novos, mas a documentação do MDC fornece uma implementação alternativa (que também usa for...inbtw):

if(!Object.keys) Object.keys = function(o){
     if (o !== Object(o))
          throw new TypeError('Object.keys called on non-object');
     var ret=[],p;
     for(p in o) if(Object.prototype.hasOwnProperty.call(o,p)) ret.push(p);
     return ret;
}

Obviamente, se você deseja chave e valor, então for...iné a única solução razoável.

Felix Kling
fonte
pme dá a chave, mas como obtenho o valor da chave? Obrigado.
Si8
1
Para ambas as chaves e valores, use o novo Object.entries () developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Kzqai
talvez seja uma indicação do meu entendimento limitado, mas essa resposta parece incrivelmente detalhada (reconhecidamente reutilizável) para algo tão simples quanto obter uma chave / valor. A resposta de @Michael Benin não deve ser marcada como a melhor?
Aaron Matthews
7
Erm ... mais alguém clicando no primeiro link é redirecionado para narcóticos anônimos?
John Duskin 27/08/19
193

Você iteraria dentro do objeto com um loop for:

for(var i in foo){
  alert(i); // alerts key
  alert(foo[i]); //alerts key's value
}

Ou

Object.keys(foo)
  .forEach(function eachKey(key) { 
    alert(key); // alerts key 
    alert(foo[key]); // alerts value
  });
Michael Benin
fonte
E se eu não quiser foo[i]ser "_proto_"?
User2284570
E se eu não quiser alertar () foo[i]se ifor some string?
User2284570
@ user2284570: eu posso ser uma string - não há problema.
Gerfried
você não quer dizer para (var i em Object.keys (foo)) {
samurai jack
103

Você pode acessar cada chave individualmente sem iterar como em:

var obj = { first: 'someVal', second: 'otherVal' };
alert(Object.keys(obj)[0]); // returns first
alert(Object.keys(obj)[1]); // returns second
user01
fonte
3
Agora você pode usar o operador spread para esse fim, fica melhor: const [firstKey, ...rest] = Object.keys(obj);
Nerlin
65

Dado o seu objeto:

var foo = { 'bar' : 'baz' }

Para obter bar, use:

Object.keys(foo)[0]

Para obter baz, use:

foo[Object.keys(foo)[0]]

Assumindo um único objeto

Aryeh Beitz
fonte
27

Um liner para você:

const OBJECT = {
    'key1': 'value1',
    'key2': 'value2',
    'key3': 'value3',
    'key4': 'value4'
};

const value = 'value2';

const key = Object.keys(OBJECT)[Object.values(OBJECT).indexOf(value)];

window.console.log(key); // = key2
theonelucas
fonte
26

Esta é a maneira mais simples e fácil. É assim que fazemos isso.

var obj = { 'bar' : 'baz' }
var key = Object.keys(obj)[0];
var value = obj[key];
     
 console.log("key = ", key) // bar
 console.log("value = ", value) // baz
Object.keys () é o método javascript que retorna uma matriz de chaves ao usar objetos.

Object.keys(obj) // ['bar']

Agora você pode iterar nos objetos e acessar valores como abaixo:

Object.keys(obj).forEach( function(key) {
  console.log(obj[key]) // baz
})
Mustkeem K
fonte
Você pode receber TypeErrorse espera que uma chave seja um número. Porque chaves são sempre strings.
Verde
15

Eu estava tendo o mesmo problema e foi isso que funcionou

//example of an Object
var person = {
    firstName:"John",
    lastName:"Doe",
    age:50,
    eyeColor:"blue"
};

//How to access a single key or value
var key = Object.keys(person)[0];
var value = person.firstName;
Chris
fonte
11
por que não var value = person[key];? Dessa forma, você não precisa saber a chave do valor que deseja extrair.
Sean Kendle
14
// iterate through key-value gracefully
const obj = { a: 5, b: 7, c: 9 };
for (const [key, value] of Object.entries(obj)) {
  console.log(`${key} ${value}`); // "a 5", "b 7", "c 9"
}

Consulte MDN

aiffin
fonte
9

Não vejo mais nada além for (var key in foo).

patapizza
fonte
5

A maneira mais fácil é usar o Underscore.js:

chaves

_.keys (object) Recupere todos os nomes das propriedades do objeto.

_.keys ({um: 1, dois: 2, três: 3}); => ["um", "dois", "três"]

Sim, você precisa de uma biblioteca extra, mas é tão fácil!

samnau
fonte
4
@lonesomeday sim, mas o sublinhado / lodash é útil de muitas outras maneiras, por isso vale a pena mencionar.
Jcollum
4

Não há outra maneira senão for ... in. Se você não quiser usar isso (talvez porque seja marginalmente ineficiente ter que testar hasOwnPropertyem cada iteração?), Use uma construção diferente, por exemplo, uma matriz de kvp's:

[{ key: 'key', value: 'value'}, ...]
Jamie Treworgy
fonte
4

Como você mencionou $.each(), aqui está uma abordagem prática que funcionaria no jQuery 1.6+:

var foo = { key1: 'bar', key2: 'baz' };

// keys will be: ['key1', 'key2']
var keys = $.map(foo, function(item, key) {
  return key;
});
Dave Ward
fonte
4

Object.keys () O método Object.keys () retorna uma matriz das propriedades enumeráveis ​​de um determinado objeto, na mesma ordem que a fornecida por um loop for ... in (a diferença é que um loop for enumera propriedades também na cadeia de protótipos).

var arr1 = Object.keys(obj);

Object.values ​​() O método Object.values ​​() retorna uma matriz dos valores de propriedades enumeráveis ​​de um determinado objeto, na mesma ordem que a fornecida por um loop for ... in (a diferença é que um loop for enumera propriedades na cadeia de protótipos).

var arr2 = Object.values(obj);

Para mais, por favor clique aqui

jesusverma
fonte
3

use para cada loop para acessar chaves em Object ou Maps em javascript

for(key in foo){
   console.log(key);//for key name in your case it will be bar
   console.log(foo[key]);// for key value in your case it will be baz
}

Nota: você também pode usar

Object.keys (foo);

vai lhe dar como esta saída:

[Barra];

jitendra varshney
fonte
1

Bem, $.eaché uma construção de biblioteca, enquanto for ... iné js nativo, que deve ser melhor

Naftali tcp Neal
fonte
1

Você pode usar a funcionalidade Object.keys para obter as chaves como:

const tempObjects={foo:"bar"}

Object.keys(tempObjects).forEach(obj=>{
   console.log("Key->"+obj+ "value->"+tempObjects[obj]);
});
Akarsh Srivastava
fonte
0

para mostrar como uma string, basta usar:

console.log("they are: " + JSON.stringify(foo));
Jiulong Zhao
fonte
0

melhor maneira de obter a chave / valor do objeto.

let obj = {
        'key1': 'value1',
        'key2': 'value2',
        'key3': 'value3',
        'key4': 'value4'
    }
    Object.keys(obj).map(function(k){ 
    console.log("key with value: "+k +" = "+obj[k])    
    
    })
    

Sahil Ralkar
fonte