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


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.


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

¿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

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


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

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

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;

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



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!


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

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

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í


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


1

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


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

0

para mostrar como una cadena, simplemente use:

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.