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


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.


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

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

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


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

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

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;

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



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!


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'}, ...]

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

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


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


1

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


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

0

para mostrar como uma string, basta usar:

console.log("they are: " + JSON.stringify(foo));

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

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.