Der beste Weg, um den Schlüssel eines Javascript-Objekts mit Schlüssel / Wert zu erhalten

182

Wenn ich ein JS-Objekt habe wie:

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

Wenn ich weiß, foodass diese grundlegende Schlüssel- / Wertstruktur vorhanden ist, aber den Namen des Schlüssels nicht kennt, wie kann ich ihn am einfachsten erhalten? for ... in? $.each()? Ich hoffe es gibt etwas besseres ....

Sprugman
quelle
5
Was ist los mit ... in?
Matt
1
Es fühlt sich indirekt an und Sie müssen hasOwnProperty verwenden. Ich denke, ich werde eine Bibliotheksfunktion machen, die das macht ...
Sprugman

Antworten:

92

Wenn Sie alle Schlüssel erhalten möchten, wurde ECMAScript 5 eingeführtObject.keys . Dies wird nur von neueren Browsern unterstützt, aber die MDC-Dokumentation bietet eine alternative Implementierung (die for...inübrigens auch btw verwendet):

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

Wenn Sie sowohl Schlüssel als auch Wert wollen, for...inist dies natürlich die einzig vernünftige Lösung.

Felix Kling
quelle
pgibt mir den Schlüssel, aber wie erhalte ich den Wert des Schlüssels? Vielen Dank.
Si8
1
Verwenden Sie für Schlüssel und Werte die neuen Object.entries () developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Kzqai
Vielleicht ist es ein Hinweis auf mein begrenztes Verständnis, aber diese Antwort scheint unglaublich ausführlich (zugegebenermaßen wiederverwendbar) für etwas so Einfaches wie das Erhalten eines Schlüssels / Werts. Sollte die Antwort von @Michael Benin nicht als die beste markiert werden?
Aaron Matthews
7
Ähm ... wird jemand anderes, der auf den ersten Link klickt, anonym zu Betäubungsmitteln weitergeleitet?
John Duskin
191

Sie würden innerhalb des Objekts mit einer for-Schleife iterieren:

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

Oder

Object.keys(foo)
  .forEach(function eachKey(key) { 
    alert(key); // alerts key 
    alert(foo[key]); // alerts value
  });
Michael Benin
quelle
Was passiert , wenn ich will nicht foo[i]sein "_proto_"?
user2284570
Was ist, wenn ich nicht alarmieren möchte (), foo[i]wenn dies der Fall iist some string?
user2284570
@ user2284570: Ich kann ein String sein - kein Problem.
Gerfried
meinst du nicht für (var i in Object.keys (foo)) {
samurai jack
103

Sie können auf jeden Schlüssel einzeln zugreifen, ohne wie folgt iterieren zu müssen:

var obj = { first: 'someVal', second: 'otherVal' };
alert(Object.keys(obj)[0]); // returns first
alert(Object.keys(obj)[1]); // returns second
user01
quelle
3
Sie können jetzt Spread-Operator für diesen Zweck verwenden, es sieht besser aus: const [firstKey, ...rest] = Object.keys(obj);
Nerlin
65

Angesichts Ihres Objekts:

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

Um zu erhalten bar, verwenden Sie:

Object.keys(foo)[0]

Um zu erhalten baz, verwenden Sie:

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

Ein einzelnes Objekt annehmen

Aryeh Beitz
quelle
26

Ein Einzeiler für Sie:

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
quelle
25

Dies ist der einfachste und einfachste Weg. So machen wir das.

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 () ist eine Javascript-Methode, die bei Verwendung für Objekte ein Array von Schlüsseln zurückgibt.

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

Jetzt können Sie die Objekte iterieren und auf Werte wie die folgenden zugreifen:

Object.keys(obj).forEach( function(key) {
  console.log(obj[key]) // baz
})
Mustkeem K.
quelle
Sie können erhalten, TypeErrorwenn Sie erwarten, dass ein Schlüssel eine Zahl ist. Weil Schlüssel immer Zeichenfolgen sind.
Grün
15

Ich hatte das gleiche Problem und das hat funktioniert

//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
quelle
11
warum nicht var value = person[key];? Auf diese Weise müssen Sie den Schlüssel des Werts, den Sie abrufen möchten, nicht kennen.
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"
}

Siehe MDN

Aiffin
quelle
9

Ich sehe nichts anderes als for (var key in foo).

Patapizza
quelle
4

Es gibt keinen anderen Weg als for ... in. Wenn Sie das nicht verwenden möchten (vielleicht, weil es geringfügig ineffizient ist, hasOwnPropertybei jeder Iteration testen zu müssen?), Verwenden Sie ein anderes Konstrukt, z. B. ein Array von KVPs:

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

$.each()Wie Sie bereits erwähnt haben , ist hier ein praktischer Ansatz, der in jQuery 1.6+ funktionieren würde:

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

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

Der einfachste Weg ist, einfach Underscore.js zu verwenden:

Schlüssel

_.keys (Objekt) Ruft alle Namen der Objekteigenschaften ab.

_.keys ({eins: 1, zwei: 2, drei: 3}); => ["eins", "zwei", "drei"]

Ja, Sie benötigen eine zusätzliche Bibliothek, aber es ist so einfach!

Samnau
quelle
4
@lonesomeday ja, aber Unterstrich / lodash sind auf viele andere Arten nützlich, es lohnt sich also, darauf einzugehen.
JCollum
4

Object.keys () Die Object.keys () -Methode gibt ein Array der eigenen aufzählbaren Eigenschaften eines bestimmten Objekts in derselben Reihenfolge zurück, wie sie von einer for ... in-Schleife bereitgestellt wird (der Unterschied besteht darin, dass eine for-in-Schleife Eigenschaften auflistet auch in der Prototypenkette).

var arr1 = Object.keys(obj);

Object.values ​​() Die Object.values ​​() -Methode gibt ein Array der aufzählbaren Eigenschaftswerte eines bestimmten Objekts in derselben Reihenfolge zurück, die von einer for ... in-Schleife bereitgestellt wird (der Unterschied besteht darin, dass eine for-in-Schleife auflistet Eigenschaften auch in der Prototypenkette).

var arr2 = Object.values(obj);

Für mehr gehen Sie bitte hier

Jesusverma
quelle
3

Verwenden Sie für jede Schleife den Zugriff auf Schlüssel in Object oder 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
}

Hinweis: Sie können auch verwenden

Object.keys (foo);

es wird Ihnen diese Ausgabe geben:

[Bar];

Jitendra Varshney
quelle
1

Nun $.eachist ein Bibliothekskonstrukt, während for ... innative js ist, was besser sein sollte

Naftali alias Neal
quelle
1

Sie können die Object.keys-Funktionalität verwenden, um folgende Schlüssel abzurufen:

const tempObjects={foo:"bar"}

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

Verwenden Sie zum Anzeigen als Zeichenfolge einfach:

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

bester Weg, um Schlüssel / Wert des Objekts zu erhalten.

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
quelle