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.