Wie greife ich auf die erste Eigenschaft eines Javascript-Objekts zu?

611

Gibt es eine elegante Möglichkeit, auf die erste Eigenschaft eines Objekts zuzugreifen ...

  1. wo Sie den Namen Ihrer Immobilien nicht kennen
  2. ohne eine Schleife wie for .. inoder jQuery's zu verwenden$.each

Zum Beispiel muss ich auf ein foo1Objekt zugreifen , ohne den Namen von foo1 zu kennen:

var example = {
    foo1: { /* stuff1 */},
    foo2: { /* stuff2 */},
    foo3: { /* stuff3 */}
};
atogle
quelle
1
Es ist wahrscheinlich besser, es zuerst in ein Array
umzuwandeln

Antworten:

1392
var obj = { first: 'someVal' };
obj[Object.keys(obj)[0]]; //returns 'someVal'

Damit können Sie auch über Indizes auf andere Eigenschaften zugreifen. Sei dir dessen bewusst! Object.keysDie Rückgabereihenfolge wird gemäß ECMAScript nicht garantiert, jedoch inoffiziell bei allen gängigen Browser-Implementierungen. Weitere Informationen hierzu finden Sie unter https://stackoverflow.com/a/23202095 .

Grzegorz Kaczan
quelle
25
Sie sagen, dass es nicht der schnellste Weg ist. Welcher Weg wäre schneller?
T Nguyen
3
Dies ist nicht sehr effizient, da ein ganzes Array aller Schlüssel des Objekts erstellt wird.
Andrew Mao
9
@ T Nguyen Ich würde es posten, wenn ich es wüsste :)
Grzegorz Kaczan
5
@DavChana - Sie haben Ihren Benchmark falsch eingestellt. Der Boilerplate-Block wird immer ausgeführt und Ihr Block 2 war leer, was bedeutet, dass das erste Ergebnis die Ausführung Boilerplate + Block1 darstellt und das zweite Ergebnis nur Boilerplate darstellt . Hier ist der richtige Benchmark: http://jsben.ch/#/R9aLQ , der zeigt, dass sie ziemlich gleich sind (führen Sie den Test mehrmals durch).
Myfunkyside
9
Ich wünschte, first()oder etwas Ähnliches könnte damit umgehen.
Fr0zenFyr
113

Probieren Sie die for … inSchleife aus und brechen Sie nach der ersten Iteration ab:

for (var prop in object) {
    // object[prop]
    break;
}
Gumbo
quelle
1
Ich denke, das ist ungefähr die einzige Option. Ich bin mir nicht sicher, ob Sie garantiert sind, dass die Eigenschaften in einer vorhersehbaren / nützlichen Reihenfolge wiederholt werden. Das heißt, Sie können foo1 beabsichtigen, aber foo3 bekommen. Wenn die Eigenschaften wie im Beispiel nummeriert sind, können Sie einen Zeichenfolgenvergleich durchführen, um den Bezeichner zu ermitteln, der mit '1' endet. Wenn Ordinalität das Hauptanliegen der Sammlung ist, sollten Sie wahrscheinlich ein Array anstelle eines Objekts verwenden.
Dampfer25
2
Wenn jemand anderes über die Reihenfolge besorgt ist, verhalten sich die meisten Browser vorhersehbar: stackoverflow.com/questions/280713/…
Flash
6
var prop; für (Stütze im Objekt) Pause; // object [prop]
netiul
12
Alte Antwort aber. Möglicherweise möchten Sie überprüfen, ob die Eigenschaft zum Objekt gehört. wie: für (..) {if (! obj.hasOwnProperty (prop)) weiter; .... brechen; } Nur für den Fall, dass das Objekt tatsächlich leer ist, durchläuft es nicht den Prototyp oder etwas anderes.
Pgarciacamou
46

Verwenden Sie Object.keysdiese Option , um ein Array der Eigenschaften eines Objekts abzurufen. Beispiel:

var example = {
    foo1: { /* stuff1 */},
    foo2: { /* stuff2 */},
    foo3: { /* stuff3 */}
};

var keys = Object.keys(example); // => ["foo1", "foo2", "foo3"] (Note: the order here is not reliable)

Dokumentation und browserübergreifendes Shim finden Sie hier . Ein Beispiel für seine Verwendung finden Sie in einer anderen meiner Antworten hier .

Bearbeiten : Aus Gründen der Übersichtlichkeit möchte ich nur das wiederholen, was in anderen Antworten korrekt angegeben wurde: Die Schlüsselreihenfolge in Javascript-Objekten ist undefiniert.

Benekastah
quelle
25

Eine Version mit einer Regel:

var val = example[function() { for (var k in example) return k }()];
netiul
quelle
2
Manchmal kann die Verwendung for inohne Überprüfung riskant sein, hasOwnPropertyda das Objekt andere unerwünschte Werte enthält, die programmgesteuert an das Objekt angehängt werden, sodass Sie möglicherweise ein unerwünschtes Ergebnis aus diesem Snippet erhalten. Nur weil es kurz und ordentlich ist, heißt das nicht, dass es sicher optimal ist.
Javier Cobos
24

Es gibt keine "erste" Eigenschaft. Objektschlüssel sind ungeordnet.

Wenn Sie sie mit for (var foo in bar)durchlaufen, erhalten Sie sie in einer bestimmten Reihenfolge, dies kann sich jedoch in Zukunft ändern (insbesondere, wenn Sie andere Schlüssel hinzufügen oder entfernen).

QUentin
quelle
Genial. Ich habe ein Objekt verwendet, um eine Karte zu implementieren, die die Einfügereihenfolge beibehält. Das bricht ab, sobald ich einen Wert entferne, weil die nächste Einfügung die Lücke ausfüllt. :(
David Harkness
2
Schlüssel / Wert-Reihenfolge sollte in neueren Versionen von JS
Alexander Mills
11

Lösung mit lodash Bibliothek:

_.find(example) // => {name: "foo1"}

Es gibt jedoch keine Garantie für die interne Speicherreihenfolge der Objekteigenschaften, da dies von der Implementierung der Javascript-VM abhängt.

pocheptsov
quelle
2
Habe das gerade getestet und es funktioniert nicht. Es wird nur der Wert zurückgegeben, nicht das Schlüssel / Wert-Paar.
Chris Haines
2
Es gibt keine Erwähnung in der Frage, dass es das Schlüssel / Wert-Paar zurückgeben soll, er fragt nur nach dem Objekt und die akzeptierte Antwort macht genauso viel wie diese lodash-Funktion: Sie gibt den Inhalt der ersten Eigenschaft zurück. Es entspricht möglicherweise nicht Ihren spezifischen Anforderungen, aber diese Antwort ist basierend auf der ursprünglichen Frage korrekt.
Carrm
Ja, macht den Job, nützlich, wenn Sie wissen, dass Ihr Objekt nur ein untergeordnetes Objekt hatvar object = { childIndex: { .. } }; var childObject = _.find(Object);
Raja Khoury
9

Nein. Ein Objektliteral im Sinne von MDC lautet:

Eine Liste mit null oder mehr Paaren von Eigenschaftsnamen und zugehörigen Werten eines Objekts in geschweiften Klammern ({}).

Daher ist ein Objektliteral kein Array, und Sie können nur mit ihrem expliziten Namen oder einer forSchleife mit dem inSchlüsselwort auf die Eigenschaften zugreifen .

Alex Rozanski
quelle
25
Für andere, die nur das grüne Häkchen bei dieser Antwort sehen, gibt es weiter unten auf der Seite eine andere Lösung mit derzeit 350 positiven Stimmen.
Redfox05
7

Die Top-Antwort könnte das gesamte Array generieren und dann aus der Liste erfassen. Hier ist eine weitere effektive Verknüpfung

var obj = { first: 'someVal' };
Object.entries(obj)[0][1] // someVal
kishorekumaru
quelle
3

Dies wurde hier schon einmal behandelt.

Das Konzept von first gilt nicht für Objekteigenschaften, und die Reihenfolge einer for ... in-Schleife wird durch die Spezifikationen nicht garantiert. In der Praxis ist es jedoch zuverlässig FIFO, außer kritisch für Chrome ( Fehlerbericht ). Treffen Sie Ihre Entscheidungen entsprechend.

Annakata
quelle
3

Ich empfehle Ihnen nicht, Object.keys zu verwenden, da dies in alten IE-Versionen nicht unterstützt wird. Aber wenn Sie das wirklich brauchen, können Sie den obigen Code verwenden, um die Rückenkompatibilität zu gewährleisten:

if (!Object.keys) {
Object.keys = (function () {
var hasOwnProperty = Object.prototype.hasOwnProperty,
    hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
    dontEnums = [
      'toString',
      'toLocaleString',
      'valueOf',
      'hasOwnProperty',
      'isPrototypeOf',
      'propertyIsEnumerable',
      'constructor'
    ],
    dontEnumsLength = dontEnums.length;

return function (obj) {
  if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');

  var result = [];

  for (var prop in obj) {
    if (hasOwnProperty.call(obj, prop)) result.push(prop);
  }

  if (hasDontEnumBug) {
    for (var i=0; i < dontEnumsLength; i++) {
      if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
    }
  }
  return result;
}})()};

Funktion Firefox (Gecko) 4 (2.0) Chrome 5 Internet Explorer 9 Opera 12 Safari 5

Weitere Informationen: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys

Wenn Sie jedoch nur die erste benötigen, können wir eine kürzere Lösung vereinbaren, z.

var data = {"key1":"123","key2":"456"};
var first = {};
for(key in data){
    if(data.hasOwnProperty(key)){
        first.key = key;
        first.content =  data[key];
        break;
    }
}
console.log(first); // {key:"key",content:"123"}
Javier Cobos
quelle
2

Um den ersten Schlüsselnamen im Objekt zu erhalten, können Sie Folgendes verwenden:

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

Gibt eine Zeichenfolge zurück, sodass Sie nicht auf verschachtelte Objekte zugreifen können, wenn:

var obj = { first: { someVal : { id : 1} }; Hier können Sie mit dieser Lösung nicht auf die ID zugreifen.

Die beste Lösung, wenn Sie das eigentliche Objekt erhalten möchten, ist die Verwendung von lodash wie:

obj[_.first(_.keys(obj))].id

So geben Sie den Wert des ersten Schlüssels zurück (wenn Sie den Namen des ersten Schlüssels nicht genau kennen):

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

Wenn Sie den Schlüsselnamen kennen, verwenden Sie einfach:

obj.first

oder

obj['first']
Diego Unanue
quelle
0

Wenn Sie auf "die erste Eigenschaft eines Objekts" zugreifen müssen, kann dies bedeuten, dass etwas mit Ihrer Logik nicht stimmt. Die Reihenfolge der Eigenschaften eines Objekts sollte keine Rolle spielen.

Flavius ​​Stef
quelle
Du hast recht. Ich brauche nicht die erste per se, sondern nur eine der foo-Eigenschaften, damit ich damit arbeiten kann. Ich brauche nur einen und war mir nicht sicher, ob es eine Möglichkeit gibt, einfach den "ersten" zu
ergattern,
0

Verwenden Sie ein Array anstelle eines Objekts (eckige Klammern).

var example = [ {/* stuff1 */}, { /* stuff2 */}, { /* stuff3 */}];
var fist = example[0];

Beachten Sie, dass Sie die 'foo'-Kennungen verlieren. Sie können den enthaltenen Objekten jedoch eine Namenseigenschaft hinzufügen:

var example = [ 
  {name: 'foo1', /* stuff1 */},
  {name: 'foo2', /* stuff2 */},
  {name: 'foo3', /* stuff3 */}
];
var whatWasFirst = example[0].name;
Dampfer25
quelle
Es gibt Situationen, in denen wir nicht können. Wir gehen davon aus, dass wir die Tatsache nicht ändern können, dass sie nicht in einem Array sind
1mike12
1
Ich denke, es ist nützlich, das Design für Leser, die ihr JSON-Schema steuern können, etwas zurückzudrängen. Im Wesentlichen erweitere ich die Antwort von Flavius ​​Stef um einige Beispiele.
Dampfer25
0

Gibt es einen Grund, dies nicht zu tun?

> example.map(x => x.name);

(3) ["foo1", "foo2", "foo3"]
jtr13
quelle
8
Weil es .map()nur für eingebaute
iterables gibt
0

Sie können verwenden, Object.prototype.keyswodurch alle Schlüssel eines Objekts in derselben Reihenfolge zurückgegeben werden. Wenn Sie also das erste Objekt möchten, holen Sie sich einfach dieses Array und verwenden Sie das erste Element als gewünschten Schlüssel.

const o = { "key1": "value1", "key2": "value2"};
const idx = 0; // add the index for which you want value
var key = Object.keys(o)[idx];
value = o[key]
console.log(key,value); // key2 value2
Akash Kumar
quelle
1
Wenn Sie eine alte Frage beantworten, ist Ihre Antwort für andere StackOverflow-Benutzer viel nützlicher, wenn Sie einen Kontext angeben, um zu erklären, wie Ihre Antwort hilft, insbesondere für eine Frage, für die bereits eine Antwort akzeptiert wurde. Siehe auch : Wie kann ich eine gute Antwort schreiben .
David Buck
0

wir können auch mit diesem Ansatz tun.

var example = {
  foo1: { /* stuff1 */},
  foo2: { /* stuff2 */},
  foo3: { /* stuff3 */}
}; 
Object.entries(example)[0][1];
Salil Sharma
quelle
0

Hier ist eine sauberere Methode, um den ersten Schlüssel zu erhalten:

var example = {
    foo1: { /* stuff1 */},
    foo2: { /* stuff2 */},
    foo3: { /* stuff3 */}
};

var object2 = {
    needThis: 'This is a value of the property',
    foo2: { /* stuff2 */},
    foo3: { /* stuff3 */}
};

let [first] = Object.keys(example)
let [firstProp] = Object.keys(object2)

console.log(first)
//Prop : needThis, Value: This is a value of the property
console.log(`Prop : ${firstProp}, Value: ${object2[firstProp]}`)

Ntiyiso Rikhotso
quelle
Aber warum das Array herum [first]. Der Benutzer hat kein Array als Antwort angefordert. Warum tun Sie dies, um first = Object.keys(example)[0]dasselbe zu tun, ohne die Antwort in ein Array einschließen zu müssen? Warum ist deine bitte sauberer?
Michael Durrant
Das ist eine Destrukturierungsaufgabe developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Ntiyiso Rikhotso