Jeśli mam taką tablicę:
var arr = ['one','two','three'];
Mogę uzyskać dostęp do różnych części, wykonując następujące czynności:
console.log(arr[1]);
Jak mogę uzyskać dostęp do właściwości obiektu według ich kolejności, a nie według klucza?
Przykład:
var obj = {
'something' : 'awesome',
'evenmore' : 'crazy'
},
jbo = {
'evenmore' : 'crazy',
'something' : 'awesome'
};
Jak uzyskać pierwszą właściwość dla każdego obiektu - „coś” z obj
i „jeszcze więcej” z jbo
- bez jawnego używania nazwy właściwości?
Niektórzy z was wydają się myśleć, że szukam czegoś takiego:
console.log(obj['something']);
Tak nie jest, chcę skierować się do indeksu, tak jak w pierwszym przykładzie - jeśli to możliwe.
javascript
arrays
daryl
źródło
źródło
Odpowiedzi:
Nie, to niemożliwe.
Najbliżej można uzyskać tablicę kluczy obiektu i użyć jej:
var keys = Object.keys( obj );
... ale nie ma gwarancji, że klucze zostaną zwrócone w określonej przez Ciebie kolejności. Może więc wyglądać następująco:
keys[ 0 ]; // 'evenmore' keys[ 1 ]; // 'something'
źródło
Object.keys()
mogą być używane niezawodnie, jeśli znasz zawartość obiektu. Więcej szczegółów tutaj: stackoverflow.com/questions/280713/ ...Jedynym sposobem, w jaki mogę to zrobić, jest utworzenie metody, która daje właściwość przy użyciu
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/
Byłoby możliwe rozszerzenie tego na wszystkie używane obiekty,
Object.prototype;
ale zwykle nie jest to zalecane.Zamiast tego użyj pomocnika funkcji:
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
źródło
return this[Object.keys(this)[n]];
aby uczynić go ogólnym.Możesz użyć
Object.values()
metody, jeśli nie chcesz używaćObject.keys()
.W przeciwieństwie do
Object.keys()
metody, która zwraca tablicę własnych wyliczalnych właściwości danego obiektu, więc na przykład:const object1 = { a: 'somestring', b: 42, c: false }; console.log(Object.keys(object1));
Wypisze następującą tablicę:
[ 'a', 'b', 'c' ]
Plik
Object.values()
Metoda zwraca tablicę własność przeliczalnego danego obiektuvalues
.Jeśli więc masz ten sam obiekt, ale zamiast tego używasz wartości,
const object1 = { a: 'somestring', b: 42, c: false }; console.log(Object.values(object1));
Otrzymasz następującą tablicę:
[ 'somestring', 42, false ]
Więc jeśli chcesz uzyskać dostęp do
object1.b
, ale używając zamiast tego indeksu, możesz użyć:Object.values(object1)[1] === 42
Możesz przeczytać więcej o tej metodzie tutaj .
źródło
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)
Edytować:
Właściwie kluczem jest „indeks”. Jeśli chcesz zapisać pozycję klucza, musisz utworzyć niestandardowy obiekt do obsługi tego.
źródło
przez jquery możesz to zrobić:
var arr = $.map(obj,function(value, key) { return value; }); alert(obj[0]);
źródło
Pobierz tablicę kluczy, odwróć ją, a następnie uruchom pętlę
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 }
źródło
możesz utworzyć tablicę wypełnioną polami obiektu i użyć indeksu w tablicy i uzyskać przez to dostęp do właściwości obiektu
propertiesName:['pr1','pr2','pr3'] this.myObject[this.propertiesName[0]]
źródło
Poszedłem do przodu i stworzyłem dla ciebie funkcję:
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"
źródło
Jeśli nie jesteś pewien, czy Object.keys () zwróci klucze we właściwej kolejności, możesz zamiast tego wypróbować tę logikę
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]])
źródło