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.


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'

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

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 .


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.


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]);

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
  }

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]]

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"


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]])
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.