2011-10-23 8 views
48

Se ho un array come questo:Accesso agli oggetti non numerici Proprietà per indice?

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

posso accedere a parti diverse in questo modo:

console.log(arr[1]); 

Come posso accedere alle proprietà degli oggetti dal loro ordine, piuttosto che a chiave?

Esempio:

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

Come faccio a ottenere la prima proprietà per ogni "qualcosa" agli oggetti da obj e "evenmore" dal jbo -senza esplicitamente utilizzando il nome della proprietà?

Ora, alcuni di voi sembrano pensare che sto cercando qualcosa di simile:

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

Questo non è il caso, io sto in particolare alla ricerca di indirizzare l'indice, proprio come il primo esempio - se è possibile.

+2

Cosa intendi per "matrice di oggetti". Un array * è * un oggetto. Intendi solo un oggetto che non è un array, o intendi una serie di oggetti. E in che modo jQuery partecipa alla tua domanda? Il tuo unico esempio di codice illustra la parte che sai già come fare. Che ne dici di dare un codice che illustri il * problema *. – user113716

+0

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

+3

In realtà direi che ci sono più persone che "conoscono" jQuery e che non conoscono JavaScript che viceversa (almeno le persone che sanno che JavaScript dovrebbe essere in grado di capire jQuery facilmente) .... e rispetto alla tua domanda attuale: No, non è possibile accedere alle proprietà objec per indice. Non sono ordinati –

risposta

72

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

No, non è possibile.

Il più vicino si può arrivare è quello di ottenere una matrice di chiavi dell'oggetto, e l'uso che:

var keys = Object.keys(obj); 

... ma non c'è alcuna garanzia che le chiavi saranno restituite nell'ordine definito. Così potrebbe finire per assomigliare:

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

'Object.keys()' potrebbe essere usato in modo affidabile se si conosce il contenuto dell'oggetto. Maggiori dettagli qui: http://stackoverflow.com/questions/280713/elements-order-in-a-for-in-loop – cronoklee

+1

Il metodo Object.keys() restituisce una matrice delle proprietà enumerabili di un dato oggetto, nel lo stesso ordine di quello fornito da a per ... in loop (la differenza è che un ciclo for-in enumera anche le proprietà nella catena del prototipo). https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys –

2
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) 

Modifica: "Sono in particolare cercando di indirizzare l'indice, proprio come il primo esempio - se è possibile"

In realtà l''indice' è la chiave. Se si desidera memorizzare la posizione di una chiave, è necessario creare un oggetto personalizzato per gestirlo.

+0

So che è possibile accedervi tramite la chiave, non è quello che stavo chiedendo. – daryl

+0

@Brogrammer: la tua domanda è ambigua, quindi questo post potenzialmente risponde alla domanda come scritto. – outis

+0

ok, quindi si prega di spiegare più – cuzzea

34

L'unico modo che posso pensare di fare questo è attraverso la creazione di un metodo che ti dà la struttura utilizzando 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 estendere questa a tutti gli oggetti che utilizzano Object.prototype; ma che non è di solito raccomandato.

Al contrario, utilizzare una funzione di supporto:

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

+1

Ciao dal 2016, noi del futuro pensiamo ancora che questa dovrebbe essere la risposta accettata. Ottima soluzione – mhodges

+0

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 con alcuni motori JS, non è garantito il funzionamento di tutti. https://stackoverflow.com/questions/5525795/does-javascript-guarantee-object-property-order – ptoinson

0

Se non si è sicuri oggetto.tasti() sta per tornare le chiavi nel giusto ordine, si può provare questa logica invece

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

da jQuery si può fare questo:

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

È possibile utilizzare il metodo Object.values() se non voglio usare il Object.keys().

A differenza del metodo Object.keys() che restituisce un array di proprie proprietà enumerabili di un determinato oggetto, così per esempio:

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

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

Sarebbe stampare il seguente array:

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

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

Quindi, se avete lo stesso oggetto ma si utilizzano valori, invece,

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

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

Si otterrebbe il seguente array:

[ 'somestring', 42, false ] 

Quindi, se si voleva accedere al object1.b, ma utilizzando un indice invece è possibile utilizzare:

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

Ulteriori informazioni su questo metodo here.

Problemi correlati