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


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.


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

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

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


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

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

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;

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



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

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

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!


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


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


1

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


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

0

Verwenden Sie zum Anzeigen als Zeichenfolge einfach:

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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.