La mejor manera de obtener la clave de un objeto javascript clave / valor

186

Si tengo un objeto JS como:

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

Si sé que footiene esa estructura básica de clave / valor, pero no sé el nombre de la clave, ¿cuál es la forma más fácil de obtenerla? for ... in? $.each()? Espero que haya algo mejor ...

Sprugman
fuente
55
¿Qué le pasa a ... en?
Matt
1
Se siente indirecto y tienes que usar hasOwnProperty. Supongo que haré una función de biblioteca que lo haga ...
sprugman

Respuestas:

93

Si desea obtener todas las claves, introdujo ECMAScript 5Object.keys . Esto solo es compatible con los navegadores más nuevos, pero la documentación de MDC proporciona una implementación alternativa (que también 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;
}

Por supuesto, si desea ambos, clave y valor, entonces for...ines la única solución razonable.

Felix Kling
fuente
pme da la clave pero ¿cómo obtengo el valor de la clave? Gracias.
Si8
1
Para claves y valores, use el nuevo Object.entries () developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Kzqai
tal vez sea una indicación de mi comprensión limitada, pero esta respuesta parece increíblemente detallada (ciertamente reutilizable) para algo tan simple como obtener una clave / valor. ¿No debería marcarse la respuesta de @Michael Benin como la mejor?
Aaron Matthews
77
Erm ... ¿alguien más que hace clic en el primer enlace es redirigido a narcóticos anónimos?
John Duskin
193

Usted iteraría dentro del objeto con un bucle for:

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

O

Object.keys(foo)
  .forEach(function eachKey(key) { 
    alert(key); // alerts key 
    alert(foo[key]); // alerts value
  });
Michael Benin
fuente
¿Qué pasa si no quiero foo[i]ser "_proto_"?
user2284570
¿Qué sucede si no quiero alertar () foo[i]si ies así some string?
user2284570
@ user2284570: puedo ser una cadena, no hay problema.
Gerfried
no te refieres a (var i en Object.keys (foo)) {
samurai jack
103

Puede acceder a cada clave individualmente sin iterar como en:

var obj = { first: 'someVal', second: 'otherVal' };
alert(Object.keys(obj)[0]); // returns first
alert(Object.keys(obj)[1]); // returns second
usuario01
fuente
3
Ahora puede usar el operador de propagación para este propósito, se ve mejor: const [firstKey, ...rest] = Object.keys(obj);
Nerlin
65

Dado su objeto:

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

Para obtener bar, use:

Object.keys(foo)[0]

Para obtener baz, use:

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

Asumiendo un solo objeto

Aryeh Beitz
fuente
27

Un trazador de líneas para usted:

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
fuente
26

Esta es la forma más simple y fácil. Así es como hacemos esto.

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 () es un método de JavaScript que devuelve una matriz de claves cuando se usa en objetos.

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

Ahora puede iterar sobre los objetos y acceder a valores como a continuación:

Object.keys(obj).forEach( function(key) {
  console.log(obj[key]) // baz
})
Mustkeem K
fuente
Puede obtener TypeErrorsi espera que una clave sea un número. Porque las llaves son siempre cadenas.
Verde
15

Estaba teniendo el mismo problema y esto es lo que funcionó

//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
fuente
11
¿por qué no var value = person[key];? De esa manera, no tiene que conocer la clave del valor que desea obtener.
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
fuente
9

No veo nada más que for (var key in foo).

patapizza
fuente
5

La forma más fácil es usar Underscore.js:

llaves

_.keys (objeto) Recupera todos los nombres de las propiedades del objeto.

_.keys ({uno: 1, dos: 2, tres: 3}); => ["uno", "dos", "tres"]

Sí, necesitas una biblioteca adicional, ¡pero es muy fácil!

samnau
fuente
44
@lonesomeday sí, pero el subrayado / lodash es útil de muchas otras maneras, por lo que vale la pena mencionarlo.
jcollum
4

No hay otra manera que no sea for ... in. Si no desea usar eso (¿quizás porque es marginalmente ineficiente tener que probar hasOwnPropertyen cada iteración?), Entonces use una construcción diferente, por ejemplo, una matriz de kvp:

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

Como mencionó $.each(), aquí hay un enfoque práctico que funcionaría en 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
fuente
4

Object.keys () El método Object.keys () devuelve una matriz de propiedades enumerables propias de un objeto dado, en el mismo orden que el proporcionado por un bucle for ... in (la diferencia es que un bucle for-in enumera propiedades en la cadena de prototipos también).

var arr1 = Object.keys(obj);

Object.values ​​() El método Object.values ​​() devuelve una matriz de valores de propiedad enumerables propios de un objeto dado, en el mismo orden que el proporcionado por un bucle for ... in (la diferencia es que un bucle for-in enumera propiedades en la cadena del prototipo también).

var arr2 = Object.values(obj);

Para más información ve aquí

jesusverma
fuente
3

use para cada bucle para acceder a claves en Object o Maps en 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: también puedes usar

Object.keys (foo);

te dará como esta salida:

[bar];

jitendra varshney
fuente
1

Bueno, $.eaches una construcción de biblioteca, mientras que for ... ines js nativo, que debería ser mejor

Naftali aka Neal
fuente
1

Puede usar la funcionalidad Object.keys para obtener las claves como:

const tempObjects={foo:"bar"}

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

para mostrar como una cadena, simplemente use:

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

La mejor manera de obtener la clave / valor del 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
fuente