Newsgroup: it.comp.lang.javascript
Titolo: Confrontare input fra loro

Ho 4 input text (parolachiave1, parolachiave2, ecc), devo confrontare 
ciascuno con gli altri 3 per verificare che non siano stati digitati valori 
duplicati.
Ho partorito questa cosa, ma purtroppo non va, l'eval forse non funziona 
come piacerebbe a me:-)
aa=0
  for(j=1; j<5; j++){
   for(b=1; b<5; b++){
    if (j!=b){
     if 
(eval("f1.parolachiave"+j+".value")==eval("f1.parolachiave"+b+".value")){
      aa++;return;
     }
    }
   }
  }
 if (aa>0){
  strErr=strErr + "Parole chiave duplicate."+"\n"}
Saluti.
Luciano

 come piacerebbe a me:-)
Ricapitoliamo:
1) hai 4 input
2) i nomi (o gli id? o entrambi?) sono parolachiaveN dove N è il numero (che va 
da 1 a 4) che identifica la parola
3) devi verificare che non esistano duplicati tra i 4 controlli.
soluzione:
a)
Ipotizzando che i nomi che indichi tu siano id (se non lo sono, fai in modo che 
lo siano), per ottenere il valore di un controllo dato il suo id, utilizza 
questo modo:
document.getElementById("parolachiave1").value
la parte "parolachiave1" è una semplice stringa e può essere composta.
molto più semplice (veloce e sicuro) dell'eval.
b)
return esce da una funzione, non da un ciclo.
sfrutta meglio i cicli for
altro consiglio, so che a scuola insegnano cicli con j, i, k, l, ecc., prova ad 
utilizzare indici del tipo j1, j2, j3, j4. In questo modo diventa imho più 
facile identificare gli indici interni (con un numero maggiore) da quelli 
esterni, e hai a disposizione più di 26 indici.
Inoltre, rifacendomi alla notazione ungara, tutte le variabili che iniziano per 
j sono sempre indici e quindi facilmente riconoscibili.
quindi
var n = 4; //numero di elementi
var bColl = false; //True se trovi una collisione
for (j1=0; j1<n && !bColl; j1++) {
   for (j2=0; j2<n; j2++) {
     if (document.getElementById("parolachiave"+(j1+1).toString()).value ==
         document.getElementById("parolachiave"+(j2+1).toString()).value) {
       bColl=true;
       break;
     }
   }
}
if (bColl) {
   alert("Collisione");
}
note:
1) gli indici vanno da 0 a n-1, in questo caso potevi fare anche da 1 a n, per 
farlo dovresti cambiare il ciclo in
for (j1=1; j1<(n+1) && ....
2) bColl è un booleano che ricorda se abbiamo trovato una coppia in collisione
Messa negata nella condizione di mantenimento del primo for, permette di uscire 
dal ciclo esterno
3) nota l'uso del break (e non del return come avevi messo tu) per l'uscita dal 
ciclo interno.
4) eval è una funzione molto potente, ma è meglio non utilizzarla se non è 
proprio necessario. In questo caso se ne può tranquillamente fare a meno.
5) il codice può essere modificato per restituire gli indici degli elementi in 
collisione.
Luca

 Ricapitoliamo:
Sono senza parole....la gentilezza in questo NG va oltre ogni aspettativa, 
altrove generalmente non č cosě. Oltre ad avermi risolto il problema mi hai 
anche dato alcune dritte per imparare qualcosa di nuovo (tipo il  && !bColl 
per uscire dal ciclo, vengo dal VB e questa cosa non esiste).
Grazie infinite a te e a tutti gli altri che con cortese pazienza stanno 
rispondendo alle mie domande....cercherň di non approfittarne troppo!
Saluti.
Luciano

 Sono senza parole....
Ritiro quello che ho detto...non funziona!:-)
Probabilmente perchè confronta anche ogni elemento con se stesso.
Ho messo come condizione al confronto if (j2!=j1) ma continua a darmi sempre 
collisione.
Saluti.
Luciano

 
il confronto, per essere anche concettualmente corretto, deve essere fatto per 
ciascun elemento con tutti i successivi.
Quindi i due for dovrebbero essere
for (j1=0; j1<n && !bColl; j1++) {
   for (j2=j1+1; j2<n; j2++) {
     if (document.getElementById("parolachiave"+(j1+1).toString()).value ==
         document.getElementById("parolachiave"+(j2+1).toString()).value) {
       bColl=true;
       break;
     }
   }
}
oppure il primo potrebbe essere anche
for (j1=0; j1<(n-1) && !bColl; j1++) {
dato che l'ultimo ciclo non valuterebbe nulla.
Prova a modificarlo così.
 > Luciano
 >
 >
Scusa, ma stamattina ero ancora addormentato.
Luca

   }
Qui c'è un errore di fondo: confronti un campo anche con sé stesso, è
normale quindi che "aa" sia sempre maggiore di zero.
-- 
~ Se i sintomi persistono, insultare il medico.

 Scusa, ma stamattina ero ancora addormentato.
Scherzi? Mi sei stato di grandissimo aiuto, grazie ancora!
Saluti.
Luciano

 creato un array.
Non posso perchè sul server mi serve di recuperare i valori singolarmente, 
non so se con lo stesso nome potrei farlo. Cmq, ho risolto nel modo 
suggerito da Luca.
Grazie mille anche a te!
Saluti.
Luciano

 non so se con lo stesso nome potrei farlo.
Certo che puoi farlo; usare lo stesso "name" per creare un array di
controlli non è certo un "hack", ma il modo corretto di farlo.
Lato server side ottieni così un array di valori, in modo del tutto
automatico. Su alcuni linguaggi ci sono alcuni accorgimenti da fare
ma il risultato è il medesimo (tipo su PHP, ad esempio).
