Newsgroup: it.comp.lang.javascript
Titolo: esistenza elemento in array

Salve, sto diventando matto per una cosa che in teoria sarebbe banale.
Ho notato che manca un metodo in JS che dica se un elemento é presente in un
array.
Così dato il mio vettore AZIE, ho creato la funzione INARRAY ma quando la
richiamo e faccio l'alert del risultato... non sembra funzionare.
Confesso di non essere un grande esperto di JS ma mi sto dando da fare per
impararlo.
Ecco qui il codice.
var azie=new Array('aziende[0]', 'aziende[1]', 'aziende[2]', 'aziende[3]');
function inarray(elemento, vettore)
 {
  len=vettore.length;
  trovato=false;
  for (i=0; i<len; i++)
   {
   if (vettore[i]==elemento)
   {trovato=true;}
  }
 return trovato;
 }
prova=inarray('aziende[0]','azie');
alert(prova);
Spero qualcuno mi possa dare una mano. Ringrazio in anticipo.
    Mark

Ho capito, lo stesso:
non é
prova=inarray('aziende[0]','azie');
ma
prova=inarray('aziende[0]',azie);
sbagliavo a richiamare l'array, mi prendeva la stringa "azie" e non il
puntatore al vettore AZIE
ciao


 vett.join("\n\t\n")+"\n\t\n").indexOf("\n\t\n"+el+"\n\t\n") > -1) }
Mmmm io non l'userei:
funziona solo se si tratta di un array di string, ci sono dei casi che fallisce (anche se remoti ci sono!), non e' molto leggibile e va circa 2.5 volte piu' lenta dell'altro...
Personalmente non mi convince molto... Ah se proprio si vuole scrivere su una riga si puo' fare :)
function inarray(el,vet)
{for(var i=0,max=vet.length;i<max;++i)if(vet[i]==el)return true;return false}

 vett.join("\n\t\n")+"\n\t\n").indexOf("\n\t\n"+el+"\n\t\n") > -1) }
Ecco, questa e' un'occasione per espandere l'oggetto Array :)
Array.prototype.exist=function(pItem){
	if (typeof pItem=="object") {
		for (var i=0; i<this.length; i++)
			if (this[i]==pItem) return true;
	}else{
		return (String("\n\t\n"+
this.join("\n\t\n")+"\n\t\n").indexOf("\n\t\n"+pItem+"\n\t\n") > -1)
	}
	return false;
}
Scritta al volo, e non ho fatto altro che incapsulare il vostro codice, ma
dovrebbe andare.
-- 
C'ya,
  ZER0 :: coder.gfxer.webDesigner();
"Questa e' una lezione difficile, ma importante: Cio' che e' stato, e cio'
che sara', non cambia cio' che e'.
Sta a te decidere poi come prendere questa cosa,se logorarsi per un passato
che non puoi cambiare, invece di prendere tutto il bene che il presente ti
offre." ()

 }
In questo modo si costruisce il metodo per l'oggetto?
E' giusto se per richiamarlo faccio:
nomearray.prototype.exist('nomeelemento'); ?
oppure devo fare:
nomearray.exist('nomeelemento'); ?
grazie ancora!
Mark

 L'unico rischio e` che 12 verrebbe uguale a "12".
Si si, ma io non mi riferivo solo a tipi int e string, gli Array in JS possono essere "iperEterogenei" cioe' si possono avere gli elementi tutti di tipi diversi e tutti quelli che si vuole:
String, Int/Float, Boolean, [Object], function()...

 nomearray.exist('nomeelemento'); ?
Esatto. Come qualsiasi altro metodo "embedded".
Nel nostro caso avresti:
var _a=new Array("a","b","c","d");
if (_a.exist("c"))
	alert(" L'elemento e' presente ")
else
	alert(" L'elemento non e' presente ")


 Si si, ma io non mi riferivo solo a tipi int e string,
JS non e' tipizzato.


 JS non e' tipizzato.
Eh gia' lo so, avrei dovuto usare le "", era tanto per capirci...

 Mi sfugge il senso di tanta ostilita`...
Macche' io ho solo risposto a delle affermazioni audaci rivolte al mio Post:
-    veramente il mio era javascript validissimo
-    ehm... "max" cosi` e` globale
-    L'unico rischio e` che 12 verrebbe uguale a "12"

Quando ho mandato il primo post e mi ero autorisposto non immaginavo
qualcuno mi rispondesse.
E devo essere sincero che  sono stato ben felice di vedere che qualcuno mi
avesse corretto gli errori e in un passaggio addiritura arrivassimo a fare
il costruttore del metodo (se così si dice). ;)
Negli ultimi post purtroppo ho letto questioni che andavano al di là della
programmazione. Io non sono un esempio di netiquette e non voglio prendere
le parti di nessuno. (non volgio addirittura sembrare un ruffiano che non é
nemmeno nel mio stile :) )
Mi sento un po' coinvolto in questa storia e perché ho lanciato la
questione. Ed é così che scrivo queste due righe.
Ringrazio indistintamente tutti per l'aiuto che mi avete dato e spero che
quelle parentesi siano chiuse e chiarite. Come può succedere, capita di
essere fraintesi nel tono... credo sia capitato a tutti :)
Anzi a dirla tutta a rileggere quel che ho scritto mi sono antipatico
anch'io... :-D
...non fateci caso!!!
Buon lavoro a tutti!!
    Mark

 usare ===, in caso di object valutare le proprieta` (ove possibile) ecc.
Anche qui io ho contestato inizialmente e credo lecitamente 2 cose:
-    la "lentezzza" del metodo (quindi la poca efficacia nonostante fosse
tutto su una riga, nonche la poca leggibilita')
-    il rischio che fallisca non tanto nel caso di etereogeneita' -dove non
funziona ma effettivamente anche l'altro metodo non farebbe molto di piu'
(come hai giustamente fatto notare)- quanto nel caso in cui un elemento
dell'Array fosse proprio costituito da uno piu' "\n\t\n".
Visto che mi sembri abbastanza prudente (quasi paranoico), bisogna ammettere
che proporre un metodo che puo' fallire, quando ne esiste uno migliore e
piu' veloce, e' come minimo da rilevare!
Visto che e' probabile che questo metodo Ora/InFuturo venga implementato da
qualcuno senza che si ponga alcun problema (niubbo e non), chissa' di cosa
sono costituiti i suoi Array...

 Alla fine usi return (hasharray[pItem])
Ni, funzionerebbe solo per array stringa/numerici.. e poi, a meno di
qualche caso particolare (mi riferisco al caso in cui il recupero di un
elemento diviene parte di una funzione critica e ciclica) e' un uso
ingiustificato di memoria.
Si potrebbe, a questo punto, estendere con un nuovo metodo l'oggetto array:
createHashTable() ;)


 Ecco perche' (per il caso generico) percorrerei la strada del casting.
Ohh, dai, ancora un paio di Post e poi ci troviamo d'accordo in tutto :)

 controllo avviene dopo l'operazione di "incremento" (o quel che sia).
Boo, io ho sempre saputo l'esatto contrario, e nel mio piu' modesto
"Elementi di informatica" esame del 1997 mi hanno detto:
for(expr1;expr2;expr3)
    statement;
next statement;
e' semanticamente equivalente a:
expr1;
while(expr2){
    statement;
    expr3;
}
next statement;
Comunque nel dubbio basta vedere cosa dice la guida di JS:
A for loop repeats until a specified condition evaluates to false. The
JavaScript
for loop is similar to the Java and C for loop. A for statement looks as
follows:
for ([initialExpression]; [condition]; [incrementExpression]) {
statements
}
When a for loop executes, the following occurs:
1. The initializing expression initial-expression, if any, is executed. This
expression usually initializes one or more loop counters, but the syntax
allows an expression of any degree of complexity.
2. The condition expression is evaluated. If the value of condition is true,
the loop statements execute. If the value of condition is false, the for
loop terminates.
3. The statements execute.
4. The update expression incrementExpression executes, and control
returns to Step 2.

 il then non c'e` neanche nel Perl
Allora ricordavo bene :P


 interpretazione semantica che erano mutuate,
Ma io ho sempre e solo parlato di "sintassi c-like", quindi per me "l'anno
zero" in tal senso deriva dalla nascita delle specifiche di quel
linguaggio, quindi dal '78 :)


 Magari potevo usare la forma unicode, non ci ho neanche pensato
Si' direi che allora e' meglio fare una cosa così:
function inarray(el,vet)
{
    var o=String.fromCharCode(0);
    return String(o+vet.join(o)+o).indexOf(o+el+o)>-1
}
Pero' ora e' su 2 righe...
:P