web-dev-qa-db-de.com

Wie kann auf die erste Eigenschaft eines Objekts in Javascript zugegriffen werden?

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 .. in oder jQuery's $.each zu verwenden

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

var example = {
    foo1: { /* stuff1 */},
    foo2: { /* stuff2 */},
    foo3: { /* stuff3 */}
};
474
atogle
var obj = { first: 'someVal' };
obj[Object.keys(obj)[0]]; //returns 'someVal'

Damit können Sie über Indizes auch auf andere Eigenschaften zugreifen. Sei dir dessen bewusst! Object.keys return order ist nicht gemäß ECMAScript garantiert. Inoffiziell wird dies jedoch von allen gängigen Browser-Implementierungen durchgeführt. Bitte lesen Sie https://stackoverflow.com/a/23202095 für Details.

1157
Grzegorz Kaczan

Versuchen Sie die for … in-Schleife und brechen Sie nach der ersten Iteration ab:

for (var prop in object) {
    // object[prop]
    break;
}
97
Gumbo

Verwenden Sie Object.keys, 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 Cross-Browser-Shim bereitgestellt hier . Ein Beispiel für seine Verwendung findet sich in einer anderen meiner Antworten hier .

Edit: Der Klarheit halber möchte ich nur wiederholen, was in anderen Antworten richtig angegeben wurde: Die Reihenfolge der Schlüssel in Javascript-Objekten ist undefiniert.

43
benekastah

Sie können auch Object.values(example)[0] ausführen.

27
garrettmaring

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

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

20
Quentin

Eine Ein-Regel-Version:

var val = example[function() { for (var k in example) return k }()];
20
netiul

Ein Objektliteral im Sinne von MDC lautet:

eine Liste von null oder mehr Paaren von Eigenschaftsnamen und zugehörigen Werten eines Objekts, eingeschlossen in geschweifte Klammern ({}).

Daher ist ein Objektliteral kein Array, und Sie können auf die Eigenschaften nur über ihren expliziten Namen oder eine for-Schleife mit dem Schlüsselwort in zugreifen.

9
Alex Rozanski

Lösung mit lodash library:

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

die interne Speicherreihenfolge der Objekteigenschaften kann jedoch nicht garantiert werden, da sie von der Implementierung von JavaScript VM abhängt.

7
pocheptsov

Ich empfehle Ihnen nicht, Object.keys zu verwenden, da es in alten IE -Versionen nicht unterstützt wird. Wenn Sie das wirklich brauchen, können Sie den obigen Code verwenden, um die Kompatibilität mit der Rückseite 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 arrangieren, 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"}
3
Javier Cobos

Dies wurde hier bereits behandelt.

Das Konzept von first gilt nicht für Objekteigenschaften. Die Reihenfolge einer for ... in-Schleife wird von den Spezifikationen nicht garantiert. In der Praxis ist es jedoch zuverlässig FIFO mit Ausnahme von kritisch für Chrom ( Fehlerbericht ). Treffen Sie Ihre Entscheidungen entsprechend.

2
annakata

Die oberste 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
1
kishorekumaru
var obj = { first: 'someVal' };
let firstPropValue = Object.values(obj)[0];

Dies gibt immer den Wert der 1. Eigenschaft zurück, in diesem Fall 'someVal'.

1
Hamza Boularbah

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 vorhanden:

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

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

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']
1
Diego Unanue

Wenn Sie auf "die erste Eigenschaft eines Objekts" zugreifen müssen, kann dies bedeuten, dass Ihre Logik fehlerhaft ist. Die Reihenfolge der Eigenschaften eines Objekts sollte keine Rolle spielen.

0
Flavius Stef

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;
0
steamer25

Gibt es einen Grund, dies nicht zu tun?

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

(3) ["foo1", "foo2", "foo3"]
0
jtr13