modo migliore per ottenere la chiave di un oggetto javascript chiave / valore


186

Se ho un oggetto JS come:

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

Se so che fooha quella struttura chiave / valore di base, ma non conosco il nome della chiave, qual è il modo più semplice per ottenerla? for ... in? $.each()? Spero che ci sia qualcosa di meglio ....


5
che cosa c'è che non va in ... in?
Matt

1
Sembra indiretto e devi usare hasOwnProperty. Immagino che farò una funzione di libreria che lo farà ....
Sprugman

Risposte:


93

Se si desidera ottenere tutte le chiavi, è stato introdotto ECMAScript 5Object.keys . Questo è supportato solo dai browser più recenti, ma la documentazione MDC fornisce un'implementazione alternativa (che utilizza anche 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;
}

Naturalmente se si desidera sia la chiave che il valore, questa for...inè l'unica soluzione ragionevole.


pmi dà la chiave ma come posso ottenere il valore della chiave? Grazie.
Si8,

1
Sia per le chiavi che per i valori, utilizza il nuovo Object.entries () developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Kzqai

forse è un'indicazione della mia comprensione limitata, ma questa risposta sembra incredibilmente verbosa (certamente riutilizzabile) per qualcosa di semplice come ottenere una chiave / valore. La risposta di @Michael Benin non dovrebbe essere contrassegnata come la migliore?
Aaron Matthews il

7
Ehm ... qualcun altro che fa clic sul primo link viene reindirizzato a narcotici anonimi?
John Duskin,

193

Dovresti iterare all'interno dell'oggetto con un ciclo 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
  });

E se non volessi foo[i]essere "_proto_"?
user2284570,


Cosa succede se non voglio avvisare () foo[i]se lo iè some string?
user2284570

@ user2284570: posso essere una stringa - nessun problema.
Gerfried,

non intendi per (var i in Object.keys (foo)) {
samurai jack

103

Puoi accedere a ciascuna chiave singolarmente senza iterare come in:

var obj = { first: 'someVal', second: 'otherVal' };
alert(Object.keys(obj)[0]); // returns first
alert(Object.keys(obj)[1]); // returns second

3
Ora puoi utilizzare l'operatore di diffusione a questo scopo, sembra migliore: const [firstKey, ...rest] = Object.keys(obj);
Nerlin il

65

Dato il tuo oggetto:

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

Per ottenere bar, utilizzare:

Object.keys(foo)[0]

Per ottenere baz, utilizzare:

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

Supponendo un singolo oggetto


27

Una fodera per te:

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

Questo è il modo più semplice e facile. Questo è come lo facciamo.

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 () è un metodo javascript che restituisce una matrice di chiavi quando si utilizza sugli oggetti.

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

Ora puoi iterare sugli oggetti e accedere a valori come sotto-

Object.keys(obj).forEach( function(key) {
  console.log(obj[key]) // baz
})

Potresti ottenere TypeErrorse ti aspetti che una chiave sia un numero. Perché le chiavi sono sempre stringhe.
Green

15

Stavo avendo lo stesso problema e questo è ciò che ha funzionato

//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
perchè no var value = person[key];? In questo modo non devi conoscere la chiave del valore che vuoi estrarre.
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"
}

Fare riferimento a MDN



5

Il modo più semplice è usare Underscore.js:

chiavi

_.keys (oggetto) Recupera tutti i nomi delle proprietà dell'oggetto.

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

Sì, hai bisogno di una libreria aggiuntiva, ma è così facile!


4
@lonesomeday sì, ma il trattino basso / lodash è utile in molti altri modi, quindi vale la pena tirarlo su.
jcollum,

4

Non c'è altro che for ... in. Se non vuoi usarlo (parhaps perché è leggermente inefficiente dover testare hasOwnPropertysu ogni iterazione?) Allora usa un costrutto diverso, ad esempio un array di kvp:

[{ key: 'key', value: 'value'}, ...]

4

Da quando hai citato $.each(), ecco un approccio utile che funzionerebbe in 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 () Il metodo Object.keys () restituisce un array di proprietà enumerabili di un determinato oggetto, nello stesso ordine di quello fornito da un ciclo for ... in (la differenza è che un ciclo for-in enumera le proprietà anche nella catena dei prototipi).

var arr1 = Object.keys(obj);

Object.values ​​() Il metodo Object.values ​​() restituisce una matrice di valori di proprietà enumerabili propri di un determinato oggetto, nello stesso ordine di quello fornito da un ciclo for ... in (la differenza è che un ciclo for-in enumera proprietà anche nella catena di prototipi).

var arr2 = Object.values(obj);

Per di più, per favore vai qui


3

utilizzare per ogni ciclo per accedere alle chiavi in ​​Object o Maps in 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: puoi anche usare

Object.keys (foo);

ti darà questo output:

[bar];


1

Bene $.eachè un costrutto di libreria, mentre for ... inè js nativo, che dovrebbe essere migliore


1

È possibile utilizzare la funzionalità Object.keys per ottenere le chiavi come:

const tempObjects={foo:"bar"}

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

0

per mostrare come una stringa, basta usare:

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

0

modo migliore per ottenere chiave / valore dell'oggetto.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.