Zugriff auf nicht numerische Objekteigenschaften nach Index?

87

Wenn ich ein Array wie dieses habe:

var arr = ['one','two','three'];

Auf diese Weise kann ich auf verschiedene Teile zugreifen:

console.log(arr[1]);

Wie kann ich auf Objekteigenschaften nach ihrer Reihenfolge und nicht nach Schlüssel zugreifen?

Beispiel:

var obj = {
    'something' : 'awesome',
    'evenmore'  : 'crazy'
},
jbo = {
    'evenmore'  : 'crazy',
    'something' : 'awesome'
};

Wie würde ich die erste Eigenschaft für jedes Objekt erhalten - "etwas" von objund "noch mehr" von - jboohne explizit den Eigenschaftsnamen zu verwenden?

Nun, einige von Ihnen scheinen zu glauben, dass ich nach etwas wie:

console.log(obj['something']);

Dies ist nicht der Fall, ich möchte speziell auf den Index abzielen, genau wie im ersten Beispiel - wenn es möglich ist.

Daryl
quelle
2
Was meinst du mit "Objektarray"? Ein Array ist ein Objekt. Meinen Sie nur ein Objekt, das kein Array ist, oder meinen Sie ein Array von Objekten? Und wie berücksichtigt jQuery Ihre Frage? Ihr einziges Codebeispiel zeigt den Teil, den Sie bereits kennen. Wie wäre es, einige Code zu geben, die das zeigt Problem .
user113716
@ Ӫ _._ Ӫ Der Grund, warum ich jQuery getaggt habe, ist, ein breiteres Publikum zu erreichen. Ich dachte, jeder, der jQuery kennt, muss ein Verständnis für Arrays haben, um meiner Frage nicht zu widersprechen, es ist Lehrbuchmaterial.
Daryl
4
Eigentlich würde ich sagen, dass es mehr Leute gibt, die jQuery "kennen" und JavaScript nicht kennen als umgekehrt (zumindest Leute, die JavaScript kennen, sollten jQuery leicht verstehen können) ... und in Bezug auf Ihre eigentliche Frage: Nein, Sie Ich kann nicht über den Index auf Objekteigenschaften zugreifen. Sie werden nicht bestellt.
Felix Kling
2
"... Ich dachte, jeder, der jQuery kennt, muss ein Verständnis für Arrays haben ..." Ich würde nicht darauf wetten.
user113716
1
@Brogrammer: Diese Frage hat nichts mit jQuery zu tun, daher ist das jQuery-Tag unangemessen.
Outis

Antworten:

123

"Ich möchte speziell auf den Index abzielen, genau wie im ersten Beispiel - wenn es möglich ist."

Nein, das ist nicht möglich.

Am nächsten können Sie ein Array der Schlüssel des Objekts abrufen und Folgendes verwenden:

var keys = Object.keys( obj );

... aber es gibt keine Garantie dafür, dass die Schlüssel in der von Ihnen festgelegten Reihenfolge zurückgegeben werden. Es könnte also so aussehen:

keys[ 0 ];  // 'evenmore'
keys[ 1 ];  // 'something'
user113716
quelle
6
Object.keys()kann zuverlässig verwendet werden, wenn Sie den Inhalt des Objekts kennen. Weitere Details hier: stackoverflow.com/questions/280713/…
cronoklee
3
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 in der Prototypkette auflistet als Gut). developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Amr Ragaey
5
alles ist möglich
Cas Bloem
46

Ich kann mir das nur vorstellen, indem ich eine Methode erstelle, mit der Sie die Eigenschaft verwenden können Object.keys();.

var obj = {
    dog: "woof",
    cat: "meow",
    key: function(n) {
        return this[Object.keys(this)[n]];
    }
};
obj.key(1); // "meow"

Demo: http://jsfiddle.net/UmkVn/

Es wäre möglich, dies auf alle Objekte mit zu erweitern, Object.prototype;aber das wird normalerweise nicht empfohlen.

Verwenden Sie stattdessen einen Funktionshelfer:

var object = {
  key: function(n) {
    return this[ Object.keys(this)[n] ];
  }
};

function key(obj, idx) {
  return object.key.call(obj, idx);
}

key({ a: 6 }, 0); // 6
0x499602D2
quelle
1
Das ist cool und wirkt wie ein Zauber! Warum ist es nicht die akzeptierte Antwort? Sie sollten es wahrscheinlich verwenden return this[Object.keys(this)[n]];, um es generisch zu machen.
Cronoklee
3
Hallo ab 2016, wir zukünftigen Leute denken immer noch, dass dies die akzeptierte Antwort sein sollte. Tolle Lösung
mhodges
Der Grund dafür, dass dies nicht die akzeptierte Antwort ist, ist, dass bis es6 die Reihenfolge der Object.keys nicht garantiert ist. Obwohl dieser Code in einigen JS-Engines funktioniert, kann nicht garantiert werden, dass er in allen funktioniert. stackoverflow.com/questions/5525795/…
ptoinson
13

Sie können die Object.values()Methode verwenden, wenn Sie die nicht verwenden möchten Object.keys().

Im Gegensatz zu der Object.keys()Methode, die ein Array der eigenen aufzählbaren Eigenschaften eines bestimmten Objekts zurückgibt, wie zum Beispiel:

const object1 = {
 a: 'somestring',
 b: 42,
 c: false
};

console.log(Object.keys(object1));

Würde das folgende Array ausdrucken:

[ 'a', 'b', 'c' ]

Die Object.values()Methode gibt ein Array der eigenen Aufzählungseigenschaft eines bestimmten Objekts zurück values.

Wenn Sie also dasselbe Objekt haben, aber stattdessen Werte verwenden,

const object1 = {
 a: 'somestring',
 b: 42,
 c: false
};

console.log(Object.values(object1));

Sie würden das folgende Array erhalten:

[ 'somestring', 42, false ]

Wenn Sie also auf das zugreifen möchten object1.b, aber stattdessen einen Index verwenden möchten , können Sie Folgendes verwenden:

Object.values(object1)[1] === 42

Weitere Informationen zu dieser Methode finden Sie hier .

Arthur Senna
quelle
1
Diese Methode innerhalb der in diesem Thema vorgeschlagenen Methode scheint die kürzeste und eleganteste zu sein.
Petro Franko
5
var obj = {
    'key1':'value',
    '2':'value',
    'key 1':'value'
}

console.log(obj.key1)
console.log(obj['key1'])
console.log(obj['2'])
console.log(obj['key 1'])

// will not work
console.log(obj.2)

Bearbeiten:

"Ich möchte speziell auf den Index abzielen, genau wie im ersten Beispiel - wenn es möglich ist."

Eigentlich ist der 'Index' der Schlüssel. Wenn Sie die Position eines Schlüssels speichern möchten, müssen Sie ein benutzerdefiniertes Objekt erstellen, um dies zu handhaben.

Cuzzea
quelle
Ich weiß, dass Sie über den Schlüssel darauf zugreifen können, das habe ich nicht gefragt.
Daryl
@Brogrammer: Ihre Frage ist nicht eindeutig, daher beantwortet dieser Beitrag möglicherweise die Frage wie geschrieben.
Outis
2

Mit jquery können Sie dies tun:

var arr = $.map(obj,function(value, key) {
    return value;
});
alert(obj[0]);
Meysam Khoshbakht
quelle
2

Holen Sie sich das Array der Schlüssel, kehren Sie es um und führen Sie dann Ihre Schleife aus

  var keys = Object.keys( obj ).reverse();
  for(var i = 0; i < keys.length; i++){
    var key = keys[i];
    var value = obj[key];
    //do stuff backwards
  }
Kareem
quelle
1

Sie können ein Array erstellen, das mit Ihren Objektfeldern gefüllt ist, einen Index für das Array verwenden und über dieses auf Objekteigenschaften zugreifen

propertiesName:['pr1','pr2','pr3']

this.myObject[this.propertiesName[0]]
arfa
quelle
1

Ich ging voran und machte eine Funktion für Sie:

 Object.prototype.getValueByIndex = function (index) {
     /*
         Object.getOwnPropertyNames() takes in a parameter of the object, 
         and returns an array of all the properties.
         In this case it would return: ["something","evenmore"].
         So, this[Object.getOwnPropertyNames(this)[index]]; is really just the same thing as:
         this[propertyName]
    */
    return this[Object.getOwnPropertyNames(this)[index]];
};

let obj = {
    'something' : 'awesome',
    'evenmore'  : 'crazy'
};

console.log(obj.getValueByIndex(0)); // Expected output: "awesome"

StackGeek
quelle
1
Können Sie erklären, was in Ihrem Ansatz getan wird?
Rahul Bhobe
Ich habe dem Code einige Kommentare hinzugefügt, damit Sie verstehen, was getan wird.
StackGeek
0

Wenn Sie nicht sicher sind, ob Object.keys () Ihnen die Schlüssel in der richtigen Reihenfolge zurückgibt, können Sie stattdessen diese Logik ausprobieren

var keys = []
var obj = {
    'key1' : 'value1',
    'key2' : 'value2',
    'key3' : 'value3',
}
for (var key in obj){
    keys.push(key)
}
console.log(obj[keys[1]])
console.log(obj[keys[2]])
console.log(obj[keys[3]])
Thiago Loddi
quelle