Accedere alle proprietà dell'oggetto non numerico per indice?


88

Se ho un array come questo:

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

Posso accedere a diverse parti in questo modo:

console.log(arr[1]);

Come posso accedere alle proprietà degli oggetti in base al loro ordine anziché in base alla chiave?

Esempio:

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

Come posso ottenere la prima proprietà per ogni oggetto - "qualcosa" da obje "ancora di più" - jbosenza utilizzare esplicitamente il nome della proprietà?

Ora, alcuni di voi sembrano pensare che io stia cercando qualcosa come:

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

Questo non è il caso, sto specificatamente cercando di indirizzare l'indice, proprio come il primo esempio, se possibile.


2
Cosa intendi per "array di oggetti". Un array è un oggetto. Intendi solo un oggetto che non è un array o un array di oggetti. E come influisce jQuery sulla tua domanda? Il tuo unico esempio di codice illustra la parte che sai già come eseguire. Che ne dici di fornire del codice che illustri il problema .
user113716

@ Ӫ _._ Ӫ Il motivo per cui ho taggato jQuery è per ottenere un pubblico più ampio, ho pensato che chiunque conosca jQuery deve avere una comprensione degli array, per non contraddire la mia domanda, è roba da manuale.
daryl

4
In realtà direi che ci sono più persone che "conoscono" jQuery e non conoscono JavaScript che viceversa (almeno le persone che conoscono JavaScript dovrebbero essere in grado di capire facilmente jQuery) .... e rispetto alla tua domanda reale: No, tu non può accedere alle proprietà dell'oggetto in base all'indice. Non sono ordinati.
Felix Kling

2
"... Ho pensato che chiunque conosca jQuery deve avere una comprensione degli array ..." Non ci scommetterei.
user113716

1
@Brogrammer: questa domanda non ha nulla a che fare con jQuery, quindi il tag jQuery è inappropriato.
uscita

Risposte:


125

"Sto specificatamente cercando di indirizzare l'indice, proprio come il primo esempio, se possibile."

No, non è possibile.

Il più vicino che puoi ottenere è ottenere un array delle chiavi dell'oggetto e usarlo:

var keys = Object.keys( obj );

... ma non c'è garanzia che le chiavi vengano restituite nell'ordine che hai definito. Quindi potrebbe finire per sembrare:

keys[ 0 ];  // 'evenmore'
keys[ 1 ];  // 'something'

6
Object.keys()potrebbe essere utilizzato in modo affidabile se conosci il contenuto dell'oggetto. Più particolare qui: stackoverflow.com/questions/280713/...
cronoklee

3
Il metodo Object.keys () restituisce un array delle proprietà enumerabili di un dato oggetto, nello stesso ordine di quello fornito da un ciclo for ... in (la differenza è che un ciclo for-in enumera le proprietà nella catena del prototipo come bene). developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
Amr Ragaey

6
tutto è possibile
Cas Bloem

48

L'unico modo in cui posso pensare di farlo è creare un metodo che ti dia la proprietà usando 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/

Sarebbe possibile estenderlo a tutti gli oggetti utilizzando, Object.prototype;ma di solito non è raccomandato.

Utilizza invece un helper di funzione:

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
Questo è fantastico e funziona come un fascino! Perché non è la risposta accettata? Probabilmente dovresti usarlo return this[Object.keys(this)[n]];per renderlo generico.
cronoklee

3
Ciao dal 2016, noi futuri pensiamo ancora che questa dovrebbe essere la risposta accettata. Ottima soluzione
Modi

Il motivo per cui non è la risposta accettata è perché fino a es6, l'ordine di Object.keys non è garantito. Quindi, anche se quel codice funziona in alcuni motori JS, non è garantito che funzioni in tutti. stackoverflow.com/questions/5525795/...
ptoinson

13

Puoi usare il Object.values()metodo se non vuoi usare il Object.keys().

Al contrario del Object.keys()metodo che restituisce un array di proprietà enumerabili di un dato oggetto, quindi per esempio:

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

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

Stamperebbe il seguente array:

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

Il Object.values()metodo restituisce un array della proprietà enumerabile di un determinato oggetto values.

Quindi, se hai lo stesso oggetto ma usi invece i valori,

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

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

Otterrai il seguente array:

[ 'somestring', 42, false ]

Quindi, se volessi accedere al file object1.b , ma usando invece un indice potresti usare:

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

Puoi leggere di più su questo metodo qui .


1
Questo metodo all'interno del suggerito in questo argomento sembra essere il più breve e il più elegante.
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)

Modificare:

"Sto specificatamente cercando di indirizzare l'indice, proprio come il primo esempio, se possibile."

In realtà l '"indice" è la chiave. Se vuoi memorizzare la posizione di una chiave devi creare un oggetto personalizzato per gestirla.


So che puoi accedervi dalla chiave, non è quello che stavo chiedendo.
daryl

@Brogrammer: la tua domanda è ambigua, quindi questo post potenzialmente risponde alla domanda come scritta.
uscita

2

da jquery puoi farlo:

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

2

Prendi l'array di chiavi, invertilo, quindi esegui il ciclo

  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

è possibile creare un array riempito con i campi oggetto e utilizzare un indice sull'array e accedere alle proprietà dell'oggetto tramite quello

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

this.myObject[this.propertiesName[0]]

1

Sono andato avanti e ho creato una funzione per te:

 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
Potresti spiegare cosa viene fatto nel tuo approccio?
Rahul Bhobe

Ho aggiunto alcuni commenti nel codice, così puoi capire cosa si sta facendo.
StackGeek

0

Se non sei sicuro che Object.keys () ti restituirà le chiavi nell'ordine corretto, puoi invece provare questa logica

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]])
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.