2012-04-16 16 views
5

Ho un semplice esempio su Python:Come utilizzare l'array come chiave in Javascript?

programs = {} 
if not programs.has_key((program, time)): 
    programs[(program, time)] = 0 
programs[(program, time)] = programs[(program, time)] + 1 

Come usare array come chiave in Javascript?

+1

Vuoi dire che vuoi usare un array come ricerca in un hash? – alex

+1

A seconda dei possibili valori di 'program' e' time', potrebbe non essere un problema usare semplicemente la rappresentazione di stringa di '[program, time]' come chiave. Poiché il valore che si utilizza come proprietà viene automaticamente convertito in una stringa, l'utilizzo è immediato. –

+0

come ha detto Rob, personalizzare la chiave come ** "program_time" ** e gestirla da solo – tym1193

risposta

3

Questo farà il trucco per voi?

jsfiddle

<script> 
var ary = {person1:'valerie', person2:'alex'}; 
for (key in ary) { 
    document.write(key, '<br>') 
} 

document.write(ary['person2'], '<br>') 
</script> 
8

Le chiavi JavaScript sono stringhe.

È necessario un WeakMap o un metodo personalizzato per associare gli array ad altri oggetti.

+3

map.set ([1,2], "woo"); map.get ([1,2]) -> non definito. C'è un modo per usare un array in questo modo? –

+2

'[1, 2]' e '[1, 2]' sono oggetti diversi. Usa 'var arr = [1, 2];' 'map.set (arr, 'woo');' e 'map.get (arr, 'woo');'. Se non è possibile mantenere un riferimento all'array, è necessario serializzarlo/cancellarlo in qualche modo. Ingenuamente, ad es. usando 'arr.join (',')' come chiave. –

+0

Sì, ho finito con l'hashing in un modo strano :) Non volevo usare le stringhe perché succede forse milioni di volte contemporaneamente. Peccato: gli array sarebbero carini. –

16

Questo sarà "lavoro". (Ma io non lo consiglio)

var a = {}; 
var b = [1,2,3];  
a[b] = 'hello'; 

// a[b] evaluates to 'hello' 
// a[[1,2,3]] evaluates to 'hello' 
// a['1,2,3'] evaluates to 'hello' 

Funziona perché quando si passa l'array [1,2,3] come il tasto cancelletto (mappa/associative-array), viene convertito alla stringa ' 1,2,3 'prima di eseguire la ricerca hash. Dovrebbe essere adatto alle tue esigenze finché non hai bisogno di due matrici diverse dello stesso valore per mappare a valori hash diversi.

var c = [1,2,3] 
// a[c] evaluates to 'hello' even though we never executed a[c] = 'hello' 
// but b == c evaluates to false 
// b & c are two separate objects with the same values, so when they 
// get converted to a string for hashing, they return the same value from the hash 

Come è stato detto, avrete bisogno di più di l'hash JavaScript standard, se si desidera utilizzare riferimenti agli oggetti come le chiavi.

Aggiornamento

Sulla base del commento da @speedplane:

Ho il sospetto che JS chiama toString() sulla matrice quando si passa in una chiave hash. Così si può facilmente verificare che cosa si sta effettivamente andando ad ottenere come chiave:

["x", "y", "z"].toString;    // 'x,y,z' 
["x,y,z"].toString();     // 'x,y,z' 
[1,2,3].toString();      // '1,2,3' 
[1,2,'3'].toString();     // '1,2,3' 
[[1],[2],[3]].toString();    // '1,2,3' 
[["x",1], ["y",2], ["z",3]].toString(); // 'x,1,y,2,z,3' 

Così ancora una volta, vi consiglio di non fare questo a meno che davvero capire cosa sta succedendo. E anche allora, non lo farei.

+0

Si noti che questo non funziona così bene se si utilizza una serie di stringhe come chiave. Ad esempio, 'var a = {}; var b = ["x", "y", "z"]; var c = ["x, y, z"]; a [b] = 'uh oh'; a [c] 'valuterà 'uh oh'. I due diversi array 'b' e' c' si associano alla stessa chiave dell'oggetto. – speedplane

+0

@speedplane Grazie per averlo indicato. Ho aggiornato la mia risposta con i tuoi esempi. Inoltre, ho affermato chiaramente che non ti consiglierei di farlo. –

Problemi correlati