Abrufen des ersten Index eines Objekts

201

Erwägen:

var object = {
  foo: {},
  bar: {},
  baz: {}
}

Wie würde ich das machen:

var first = object[0];
console.log(first);

Offensichtlich funktioniert das nicht, weil der erste Index benannt ist foo, nicht 0.

console.log(object['foo']);

funktioniert, aber ich weiß nicht, dass es foo heißt. Es könnte alles benannt werden. Ich will nur den ersten.

Ryan Florence
quelle

Antworten:

61

Wenn die Reihenfolge der Objekte von Bedeutung ist, sollten Sie Ihr JSON-Schema überarbeiten, um die Objekte in einem Array zu speichern:

[
    {"name":"foo", ...},
    {"name":"bar", ...},
    {"name":"baz", ...}
]

oder vielleicht:

[
    ["foo", {}],
    ["bar", {}],
    ["baz", {}]
]

Wie Ben Alpert betont, sind die Eigenschaften von Javascript-Objekten ungeordnet, und Ihr Code ist fehlerhaft, wenn Sie erwarten, dass sie in derselben Reihenfolge aufgelistet werden, in der sie im Objektliteral angegeben sind - es gibt keine "erste" Eigenschaft.

Meilen
quelle
6
Ich habe noch nie gesehen, dass (ich in obj) Dinge in einer anderen Reihenfolge mache. Wollen Sie damit sagen, dass manchmal für (ich in obj) Dinge in einer anderen Reihenfolge rausgeschmissen werden?
Ryan Florence
4
Es ist möglich, dass es wird. Die Spezifikationen besagen, dass es nicht in einer bestimmten Reihenfolge aufgezählt werden muss. Dies bedeutet so ziemlich, dass sich diese Reihenfolge ändern kann.
PatrikAkerstrand
5
Die meisten Browser behalten heutzutage die Einfügereihenfolge bei, aber das war nicht immer der Fall. Es wird von der Spezifikation nicht benötigt, und es gab neuere Versionen von Chrome, bei denen die Einfügereihenfolge nicht beibehalten wurde.
Meilen
1
Als ich tiefer in meine Arbeit einstieg, wurde die Reihenfolge der Dinge wichtiger (ich dachte, ich kümmere mich nur um die erste, aber ich habe mich geirrt!), So dass es klar war, meine Objekte in einem Array zu speichern, wie Sie vorgeschlagen haben.
Ryan Florence
1
Wenn Sie wissen, dass das Objekt nur ein Element enthält, kennen Sie die Reihenfolge.
Danorton
329

Nur zum Spaß funktioniert dies in JS 1.8.5

var obj = {a: 1, b: 2, c: 3};
Object.keys(obj)[0]; // "a"

Dies entspricht der Reihenfolge, die Sie sehen würden

for (o in obj) { ... }
Jacob
quelle
24
Klar die beste Option, es sei denn, Steinzeit-Backword-Kompatibilität ist erforderlich.
Dag Sondre Hansen
1
100% die beste Antwort. Dies ist der einfachste und schnellste Weg, dies zu tun.
Fall
3
Nur zur Verdeutlichung, laut en.wikipedia.org/wiki/JavaScript#Version_history wird JS 1.8.5 vor IE9 nicht unterstützt. Leider sind viele Menschen noch in der Steinzeit.
Noremac
Tolle Sache. Kurz und einfach. Danke @Jacob
Sariban D'Cl
Wenn jemand IE9 benutzt, fühle ich seinen Schmerz. danke das ist erstaunlich
CMS
204

Wenn Sie etwas Prägnantes wollen, versuchen Sie:

for (first in obj) break;

alert(first);

als Funktion verpackt:

function first(obj) {
    for (var a in obj) return a;
}
Patrick Hayes
quelle
8
In der Antwort von Luke Schafer unten wird die hasOwnProperty-Methode verwendet, um sicherzustellen, dass Sie keine Prototyp-Mitglieder greifen.
Code Commander
3
Damit ein Einzeiler in allen Browsern einschließlich IE8 und darunter funktioniert, verwenden for (var key in obj) if (obj.hasOwnProperty(key)) break;Sie die keyVariable
Ally
funktioniert nicht, wenn das erste Element ein Objekttyp ist. gibt 0 zurück
Schnee
Object.keys(obj)[0];ist viel schneller (0,072 ms) als for(1,644 ms).
Sebastian Ortmann
77

Sie sind nicht wirklich bestellt, aber Sie können tun:

var first;
for (var i in obj) {
    if (obj.hasOwnProperty(i) && typeof(i) !== 'function') {
        first = obj[i];
        break;
    }
}

Es .hasOwnProperty()ist wichtig, prototypisierte Objekte zu ignorieren.

Luke Schafer
quelle
Im obigen Code ist ein Fehler aufgetreten. Die Art der Prüfung sollte Typ (i) sein
jacob.toye
@ Napalm bezog er sich auf den Fehler im zu überprüfenden Variablennamen, nicht auf die Syntax. Sie haben Recht, aber viele Leute mögen die Klammer für die Lesbarkeit
Luke Schafer
Danke dir. Es ist wunderbar.
Santosh
76

Dies gibt Ihnen nicht das erste, da Javascript-Objekte ungeordnet sind. Dies ist jedoch in einigen Fällen in Ordnung.

myObject[Object.keys(myObject)[0]]
Rob Fox
quelle
39

für den ersten Schlüssel des Objekts können Sie verwenden

console.log(Object.keys(object)[0]);//print key's name

für Wert

console.log(object[Object.keys(object)[0]]);//print key's value
Jitendra Varshney
quelle
18

Es gibt keine Möglichkeit, das erste Element abzurufen, da "Hashes" (Objekte) in JavaScript ungeordnete Eigenschaften haben. Am besten speichern Sie die Schlüssel in einem Array:

var keys = ["foo", "bar", "baz"];

Verwenden Sie das dann, um den richtigen Wert zu erhalten:

object[keys[0]]
Sophie Alpert
quelle
16

ES6

const [first] = Object.keys(obj)
Richard Ayotte
quelle
Es funktioniert, aber können Sie bitte erklären, wie das funktioniert? Nur den Code zu zeigen, bringt mich nicht dazu, ihn zu verstehen.
Daan
1
Es ist eine destrukturierende Aufgabe . Im Wesentlichen weist es der Variablen in eckigen Klammern das erste Element des zurückgegebenen Arrays zu.
Richard Ayotte
12

Mit dem Unterstrich können Sie _.pairs verwenden, um den ersten Objekteintrag wie folgt als Schlüsselwertpaar abzurufen:

_.pairs(obj)[0]

Dann wäre der Schlüssel mit einem weiteren [0]Index verfügbar , dem Wert mit[1]

Sauerstoff
quelle
Funktioniert am besten, wenn underscore.js verwendet wird. Genau das, was ich brauchte ... Danke, George!
Goldengalaxy
10

Ich hatte gestern das gleiche Problem. Ich habe es so gelöst:

var obj = {
        foo:{},
        bar:{},
        baz:{}
    },
   first = null,
   key = null;
for (var key in obj) {
    first = obj[key];
    if(typeof(first) !== 'function') {
        break;
    }
}
// first is the first enumerated property, and key it's corresponding key.

Nicht die eleganteste Lösung, und ich bin mir ziemlich sicher, dass sie in verschiedenen Browsern zu unterschiedlichen Ergebnissen führen kann (dh die Spezifikationen besagen, dass keine Aufzählung erforderlich ist, um die Eigenschaften in derselben Reihenfolge aufzulisten, in der sie definiert wurden). Ich hatte jedoch nur eine einzige Eigenschaft in meinem Objekt, sodass dies kein Problem war. Ich brauchte nur den ersten Schlüssel.

PatrikAkerstrand
quelle
1
Hallo @PatrikAkerstrand früh habe ich versehentlich in downvote geklickt. Bitte nehmen Sie Änderungen an Ihrer Antwort vor, um sie rückgängig zu machen. Es tut uns leid.
Rogeriolino
7

Sie könnten so etwas tun:

var object = {
    foo:{a:'first'},
    bar:{},
    baz:{}
}


function getAttributeByIndex(obj, index){
  var i = 0;
  for (var attr in obj){
    if (index === i){
      return obj[attr];
    }
    i++;
  }
  return null;
}


var first = getAttributeByIndex(object, 0); // returns the value of the
                                            // first (0 index) attribute
                                            // of the object ( {a:'first'} )
CMS
quelle
6

Um den ersten Schlüssel Ihres Objekts zu erhalten

const myObject = {
   'foo1': { name: 'myNam1' },
   'foo2': { name: 'myNam2' }
}

const result = Object.keys(myObject)[0];

// result will return 'foo1'
ldls
quelle
Was ist der Unterschied zwischen dieser Antwort und der des Jakobs?
YakovL
Es gibt dem Frischer das Vertrauen, dass diese Art von Code perfekt funktioniert.
Santosh
5

Basierend auf CMS Antwort . Ich erhalte den Wert nicht direkt, sondern nehme den Schlüssel an seinem Index und verwende ihn, um den Wert zu erhalten:

Object.keyAt = function(obj, index) {
    var i = 0;
    for (var key in obj) {
        if ((index || 0) === i++) return key;
    }
};


var obj = {
    foo: '1st',
    bar: '2nd',
    baz: '3rd'
};

var key = Object.keyAt(obj, 1);
var val = obj[key];

console.log(key); // => 'bar'
console.log(val); // => '2nd'
yckart
quelle
2

Meine Lösung:

Object.prototype.__index = function(index)
{
    var i = -1;
    for (var key in this)
    {
        if (this.hasOwnProperty(key) && typeof(this[key])!=='function')
            ++i;
        if (i >= index)
            return this[key];
    }
    return null;
}
aObj = {'jack':3, 'peter':4, '5':'col', 'kk':function(){alert('hell');}, 'till':'ding'};
alert(aObj.__index(4));
DIYismus
quelle
12
nur nett ... dein Codierungsstil! was zur Hölle? Diese Zahnspangen sind überall!
fliegende Schafe
2
Kennst du den Python-Stil? Ich habe gerade vertikal ausgerichtete Klammern in den Python-Stil eingefügt. Wie auch immer, "Hölle ist andere Leute" ,:
D