Uzyskać dostęp do nienumerycznych właściwości obiektu według indeksu?

88

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 obji „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.

daryl
źródło
2
Co masz na myśli mówiąc „Tablica obiektów”. Tablica to obiekt. Czy masz na myśli tylko obiekt, który nie jest tablicą, czy masz na myśli tablicę obiektów. A jak jQuery wpływa na twoje pytanie? Twój jedyny przykład kodu ilustruje część, którą już wiesz, jak to zrobić. Co powiesz na podanie kodu ilustrującego problem .
user113716
@ Ӫ _._ Ӫ Powodem, dla którego otagowałem jQuery, jest zdobycie szerszej publiczności. Pomyślałem, że każdy, kto zna jQuery, musi rozumieć tablice, a nie zaprzeczać mojemu pytaniu, to podręcznik.
daryl
4
Właściwie powiedziałbym, że jest więcej ludzi „znających” jQuery i nie znających JavaScript niż na odwrót (przynajmniej ludzie, którzy znają JavaScript powinni być w stanie z łatwością zrozumieć jQuery)… i w odniesieniu do twojego rzeczywistego pytania: Nie, ty nie ma dostępu do właściwości obiektu według indeksu. Nie są uporządkowane.
Felix Kling
2
„… Pomyślałem, że każdy, kto zna jQuery, musi rozumieć działanie array…” Nie postawiłbym na to.
user113716
1
@Brogrammer: to pytanie nie ma nic wspólnego z jQuery, więc tag jQuery jest nieodpowiedni.
outis

Odpowiedzi:

125

„Szczególnie zależy mi na indeksie, tak jak w pierwszym przykładzie - jeśli to możliwe”.

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'
user113716
źródło
6
Object.keys()mogą być używane niezawodnie, jeśli znasz zawartość obiektu. Więcej szczegółów tutaj: stackoverflow.com/questions/280713/ ...
cronoklee
3
Metoda Object.keys () zwraca tablicę własnych wyliczalnych właściwości danego obiektu, w tej samej kolejności, w jakiej zapewnia pętla for ... in (różnica polega na tym, że pętla for-in wylicza właściwości w łańcuchu prototypów jako dobrze). developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Amr Ragaey
6
wszystko jest możliwe
Cas Bloem
48

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
0x499602D2
źródło
1
To jest fajne i działa jak urok! Dlaczego nie jest to akceptowana odpowiedź? Prawdopodobnie powinieneś użyć, return this[Object.keys(this)[n]];aby uczynić go ogólnym.
cronoklee
3
Witam od 2016 roku, my przyszli ludzie nadal uważamy, że to powinna być akceptowana odpowiedź. Świetne rozwiązanie
mhodges
Powodem, dla którego nie jest to akceptowana odpowiedź, jest to, że przed es6 kolejność Object.keys nie jest gwarantowana. Tak więc, mimo że ten kod działa w kilku silnikach JS, nie ma gwarancji, że zadziała we wszystkich. stackoverflow.com/questions/5525795/…
ptoinson
13

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 obiektu values.

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 .

Arthur Senna
źródło
1
Ta metoda w ramach proponowanych w tym temacie wydaje się być najkrótsza i najbardziej elegancka.
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)

Edytować:

„Szczególnie zależy mi na indeksie, tak jak w pierwszym przykładzie - jeśli to możliwe”.

Właściwie kluczem jest „indeks”. Jeśli chcesz zapisać pozycję klucza, musisz utworzyć niestandardowy obiekt do obsługi tego.

cuzzea
źródło
Wiem, że możesz uzyskać do niego dostęp za pomocą klucza, nie o to pytałem.
daryl
@Brogrammer: Twoje pytanie jest niejednoznaczne, więc ten post może potencjalnie odpowiedzieć na pytanie tak, jak zostało napisane.
outis
2

przez jquery możesz to zrobić:

var arr = $.map(obj,function(value, key) {
    return value;
});
alert(obj[0]);
Meysam Khoshbakht
źródło
2

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
  }
Kareem
źródło
1

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]]
arfa
źródło
1

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"

StackGeek
źródło
1
Czy mógłbyś wyjaśnić, co zostało zrobione w Twoim podejściu?
Rahul Bhobe
Dodałem kilka komentarzy do kodu, abyś mógł zrozumieć, co się dzieje.
StackGeek
0

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]])
Thiago Loddi
źródło