Newsgroup: it.comp.lang.javascript
Titolo: Dizionari

Salve,
avrei bisogno di un dizionario la cui chiave deve essere una stringa e il 
valore deve essere un dizionario la cui chiave deve essere una stringa e il 
valore un intero. Il seguente codice pensavo facesse quello che mi serve:
D = {}
chiave = "pippo"
D["indice"] = {chiave : 10}
Ma l'istruzione:
A["indice"]["pippo"]
invece che darmi 10 mi segnala un errore.
Che sintassi dovrei usare?
Grazie 

 invece che darmi 10 mi segnala un errore.
e D["indice"]["chiave"] cosa ti dice? ...
-- 
"Emancipate yourselves from mental slavery;
None but ourselves can free our minds"
									    B.M.

 e D["indice"]["chiave"] cosa ti dice? ...
In questo modo mi da il valore corretto (10) ma io voglio che la chiave non 
sia la variabile ma la stringa che contiene.
Ciao 

 A["indice"]["pippo"]
Questa è chiaramente
D["indice"]["pippo"] :-D 

 In questo modo mi da il valore corretto (10) 
lo so, era uno stimolo il mio ... come vedi non puoi usare direttamente
variabili in quel contesto...
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Functions:eval
-- 
"Ho smesso di fumare.
 Vivrò una settimana di più.
 E in quella settimana pioverà a dirotto"
									    W.A.

Il Fri, 29 Jun 2007 16:10:44 +0200, Cristiano Larghi ha scritto:
un qualcosa del tipo:
 eval("D['indice']={"+chiave+":10}");
-- 
"qualcuno è andato per età
 qualcuno perchè già dottore
 e insegue una maturità, si è sposato, fa carriera
 ed è una morte un po' peggiore"
									    F.G.

 eval("D['indice']={"+chiave+":10}");
Si funziona, ma cosa va eval?
Quale sarebbe il significato di questa istruzione?
Per caso estrae il valore di chiave, e gli concatene le virgolette?
Ho notato che se metto D["indice"] cioè con le virgolette invece che apici, 
non funziona 

 non funziona
Stai usando " per delimitare il parametro passato a eval, se usi " anche
internamente chiudi il parametro ... se scambi in tutta la riga ' con "
vedrai che funziona (" e ' puoi usarli indifferentemente per delimitare
stringhe o parti di essa)
-- 
"Affacciati affacciati benedici, guardaci
 guardaci...guardaci!
 Tanto sono quasi duemila anni che stai a guardare!"
									    E.B.

 apici, non funziona
Ho letto su internet come funziona eval... ma per caso il suo compito è 
trasformare in codice interpretabile il suo argomento? 

 trasformare in codice interpretabile il suo argomento?
eval("alert('ciao');"); esegue alert("ciao");
eval("pippo='pluto'"); crea una variabile globale di nome pippo e valore
pluto 
etc etc
praticamente esegue l'istruzione tra parentesi, dove però l'istruzione è
"costruibile" a runtime.
-- 
"That until there is no longer first class
And second class citizens of any nation
Until the colour of a man's skin
Is of no more significance than the colour of his eyes
Me say war"
B.M.

 "costruibile" a runtime.
Ho provato a generalizzare anche l'indice ma mi da errore:
D = {}
oggetto = "spada"
dove = "Una stanza"
eval('D["+oggetto+"]={"+dove+":10}')
world.note(D["spada"]["Una stanza"])
Mi dice:
'D.spada.Una stanza' è nullo o non è un oggetto.
Grazie 

 eval('D["+oggetto+"]={"+dove+":10}')
analizza quello che hai scritto:
 eval(' <=ok, usi ' per delimitare il parametro, e lo chiudi alla fine ...
ossia: stai eseguendo l'struzione
D["+oggetto+"]=.... .... .... .... devi chiudere le virgolette per il
parametro se vuoi scriverci il valore di una variabile...
eval('D["'+oggetto+'"]= .... ed eseguirą D["spada"]= ....
-- 
"E' l' ignoranza che crea l'intolleranza
 di gente cieca e senza coscienza"
									  S.S.S.

 eval('D["'+oggetto+'"]= .... ed eseguirą D["spada"]= ....
Il seguente codice non mi stampa niente:
D = {}
oggetto = "spada"
dove = "Una stanza"
eval('D["'+oggetto+'"]={"+dove+":10}')
world.note(D["spada"]["Una stanza"]) // Non stampa niente.
La funzione world.note č legata ad un programma che fa uso di javascript per 
realizzare script e serve per stampare.
Cmq mi sono accorto che quello che la struttura dati dovrebbe avere come 
chiave un array di dizionari ma devo accedere potendo usare una stringa come 
chiave, ad esempio:
D["spada"]["Una stanza"] // stampa 10
D["spada"]["Un viale"] // stampa 11
Dovrebbe essere qualcosa del tipo:
D = {string :Array({})
ma consentire l'accesso sempre tramite stringa e non indice numerico tipico 
degli array.
La struttura dati necessaria si sta facendo un po' complicata :-/

 D["spada"]["Una stanza"] // stampa 10
e cosa c'č di diverso da adesso?


 e cosa c'č di diverso da adesso?
Il fatto che ad una chiave non deve piů corrispondere un dizionario ma 
un'array di dizionari ma non so con che sintassi inserire i valori a 
run-time.
Ciao 

 D["indice"] = {chiave : 10}
	var D = {};
	D["indice"] = {};
	var chiave  = "pippo";
	D["indice"][chiave] = 10;
	alert(D["indice"]["pippo"]); // 10
Se vuoi maggiori informazioni circa questi argomenti, puoi trovarne
parecchie cercando negli archivi di questo NG (google groups).
-- 
~ Se i sintomi persistono, insultare il medico.

 alert(D["indice"]["pippo"]); // 10
Ah ecco cosi funziona, in pratica è meglio vedere la struttura in oggetto 
come una sorta di array bidimensionale invece che un dizionario.
Grazie 

In pratica a me serve una struttura per poter memorizzare dati come segue:
Per ogni oggetto devo memorizzare il luogo in cui si trova e per ogni luogo 
devo memorizzare quanti di quegli oggetti ci sono:
La sintassi per costruire una struttura simile potrebbe essere:
D["spada"]["stanza"] = 3   // 3 spade in una stanza
D["spada"]["negozio"] = 4 // 4 spade in un negozio
D["pugnale"]["negozio"] = 2 // 2 pugnali in un negozio
Il problema č popolare questa struttura a runtime dato che una cosa simile 
ovviamente non funziona:
for (...) {   // ciclo che scorre i vari oggetti
oggetto = NomeOggetto // NomeOggetto cambia ad ogni ciclo
dove = Locazione // Locazione cambia ad ogni ciclo
if (D[oggetto][dove] == undefined)
   D[oggetto][dove] = 1
else
    D[oggetto][dove]++
}
Il precedente if risolvere tutti i problemi se solo il linguaggio fosse in 
grado di trattare D[oggetto][dove] come una variabile unica in cui assegnare 
successivamente un valore. Purtroppo l'istruzione D[oggetto][dove] da errore 
in quanto al momento in cui l'interprete calcola D[oggetto] si aspetta che 
essa contenga qualcosa e non essendoci niente non riesce a seleziona [dove]. 
Il punto č che lui non dovrebbe selezionare nulla ma piuttosto considerare 
il tutto come un unica variabile e restituire undefined invece di dare 
errore.
In ogni caso alla fine ho ottenuto quello che volevo in altro modo, cioč 
scrivendomi una funzione apposta, ma preferirei utilizzare una struttura che 
mi consenta di scrivere codice piů breve ed elegante.
Ciao 

 come una sorta di array bidimensionale invece che un dizionario.
No, in pratica è meglio vedere la struttura in oggetto, come quello
che è ovvero un oggetto.
Non è né un array bidimensionale, né un dizionario; è un oggetto al
quale imposti a runtime delle proprietà, che poi vai a recuperare.
Come ti ho già consigliato, cerca negli archivi di questo newsgroup
per approfondire l'argomento.
Se cerchi "array associativi" dovresti ottenere buoni risultati, in
quanto molto spesso gli Object usati in quel modo vengono scambiati
per array associativi.
-- 
~ Always remember you're unique, just like everyone else.

 dove = Locazione // Locazione cambia ad ogni ciclo
for (var oggetto in D){
	for (var dove in D[oggetto]){
		alert(D[oggetto][dove]+" "+oggetto+" in "+dove)
	}		
}
-- 
~ Una volta, qui, era tutto <TABLE>.