Newsgroup: it.comp.lang.javascript
Titolo: length e array associativi

salve
qualcuno potrebbe gentilmente spiegarmi perche' se scrivo
disney[0]="Topolino";
disney[1]="Pippo";
disney.length e' giustamente = 2
mentre se lo faccio con un array associativo
disney["Topolinia"]="Topolin";
disney["Paperopoli"]="Pippo";
disney.length e' sempre = 0 ?
grazie
Rob 

 mentre se lo faccio con un array associativo
[cut]
.. Lo ripeto per l'ennesima volta, non esistono "array associativi" in JS:
http://groups.google.it/groups?hl=it&lr=&selm=5fkpmyyjoh6c%24.dlg%40ID-171124.news.individual.net
-- 
ZER0
~ The Tangent Universe collapsed 5932 days, 1 hours, 49 minutes and 22 seconds ago.

 
Non saprei dire qual'e' l' esatta definizione di array associativo, ma 
cosa manca a Object per essere "visto" e usato come un array associativo?
Se dici che *non è* un array associativo, nel senso che *non è solo* un 
array associativo sono daccordo con te. Ma a mio avviso *è anche* un 
array associativo, quindi array associativo è un *sottoinsieme proprio* 
di Object.
http://www.jalix.org/ressources/internet/javascript/_JS15guide/JS15core/obj.html#1008312
Ciao.
	-Ema-

 array associativo sono daccordo con te.
Non e' un array associativo nel senso che non e' un array associativo.
Come ho detto, ci si puo' riferire (a livello di scrittura intendo) come se
fossero "array associativi", ma e' solo una questione di notazione.
Per me window non e' un array associativo. E' un oggetto.
Posso riferirmi alle sue proprieta'/metodi usando la *notazione*
window.alert o window["alert"]. Questo non lo fa diventare un array
associativo. E' solo una questione ti *notazione*.
Ci si puo' riferire alle sue proprieta' come si farebbe nel caso di un
array associativo? Certo. Ma non e' un'array associativo, e per me e'
sbagliato confondere le due cose.
Tant'e' che la gente, poi, si chiede - per l'appunto - "come mai length
restituisce sempre zero".
Perche' non sta aggiungendo elementi ad un array. Sta aggiungendo
*proprieta'* ad una *istanza* dell' *oggetto* array, utilizzando la square
bracket notation.
Ed e' questa che, inizialmente, trae in inganno chi si avvicina al
linguaggio.
C'e' differenza? Per me si, e tanta.
Come se non bastasse,un array associativo ad esempio mantiene l'ordine
d'inserimento degli elementi. Se ben ricordo, da specifiche ECMAScript
invece, quando si cicla le proprieta' di un oggetto (for .. in ..) e'
quest'ultimo che fornisce un'interfaccia che definisce l'ordine in cui
vengono restituite.
Fortuna vuole che la maggior parte delle software house che producono
browser, abbiano pensato bene di far restituire le proprieta' in base a
certi criteri, che - nel caso di oggetti propri - diventa l'ordine
cronologico di inserimento.
Ma come scopri' all'epoca artemis, se non ricordo male, Opera (almeno fino
alla versione di quel periodo) utilizzava un criterio "non ben
specificato", che non era quello di inserimento cronologico; e gli sballava
tutta una serie di script per la composizione di un menu'.
E comunque su internet si trovano tantissimi oggetti javascript che
eseguono dignitosamente il compito di array associativi, nel vero senso del
termine. Ne vidi uno non poco tempo fa che era fatto veramente bene.
-- 
ZER0
~ The Tangent Universe collapsed 5932 days, 4 hours, 36 minutes and 55 seconds ago.

Temo che l'errore che fanno i più sia sul concetto di Array Associativo:
http://www.google.it/search?hl=it&lr=&oi=defmore&q=define:Associative+Array
Un array associativo non prevede conta di elementi o un ordine di 
attraversamento prestabilito.
Che la notazione del linguaggio mi permetta di accedervi tramite dot 
notation piuttosto che con square bracket notation non sposta il punto. 
Ho un contenitore in cui posso associare valori a stringhe e questo 
dovrebbe bastare per definirlo array associativo.
E' vero però che molti linguaggi che offrono "esplicitamente" questo 
tipo di dato (Perl,PHP,Python, ...) lo accompagnano ad una serie di API 
built-in nel linguaggio che offrono questo tipo di funzionalità per cui 
probabilmente nella percezione comune Array associativo è qualcosa di 
più di quello che è in javascript.
Ciao.
	-Ema-

 piů di quello che č in javascript.
Ribadisco, di punti in comune ce ne hanno, a partire dalla square bracket
notation. Ma gli oggetti JS fanno qualcosa in piu' degli array associativi,
e gli array associativi fanno qualcosa di diverso dagli oggetti JS.
Tu hai detto che l'array associativo e' un sottoinsieme dell'oggetto JS. Io
dico che i due insiemi s'intersecano tra loro.
-- 
ZER0
~ The Tangent Universe collapsed 5932 days, 6 hours, 1 minutes and 5 seconds ago.

Vedasi Hashtable/Dictonary.
Dipende dal tipo/classe e dall'implementazione, per esempio vedi
http://www.sgi.com/tech/stl/
 (Standard Template Library, C++), alcune
classi "are not guaranteed to be in any meaningful order".
'bye

 
http://www.sgi.com/tech/stl/
 (Standard Template Library, C++)
Non sono andato a leggermi nello specifico questo link, ma ad una prima
occhiata mi pare che la conta degli elementi sia considerata in quelle
implementazioni.
Cmq li' parla di "associative container"; che come definizione -  a mio
avviso - e' piu' generica e meno specifica di "associative array"; questo
ovviamente e' un parere personale non conoscendo nel dettaglio le librerie
in questione.
-- 
ZER0
~ The Tangent Universe collapsed 5932 days, 7 hours, 23 minutes and 11 seconds ago.

 Tu hai detto che l'array associativo e' un sottoinsieme dell'oggetto
 > JS. Io dico che i due insiemi s'intersecano tra loro.
Beh. Mi pare che l'oggetto del condendere sia la definizione di Array 
associativo. E' chiaro che una volta definito con precisione e senza 
ambiguità cos'è un array associativo possiamo dire con altrettanta 
precisione se il tipo di dati Object può essere anche un array 
associativo oppure no.
Io ho sempre *dato per scontato* che un array associativo sia un 
contentitore i cui elementi sono associazioni di stringhe a valori; 
indipendentemente da come questo è implementato (tanto più nei linguaggi 
interpretati).
Così come un array "normale" è una semplice associazione tra indici 
*consecutivi* e valori. Di per se nessuno dei due deve necessariamente 
darmi il numero di elementi contenuti e/o un modo univoco di 
attraversamento. Quelli che in C vengono normalmente definiti array sono 
delle porzioni di memoria e sta a me mantenere il conto degli elementi, 
il puntatore di suo non lo sa. Il fatto che gli array "normali" siano 
enumerabili è dovuto alla natura delle chiavi, cioè sappiamo quali 
chiavi gli abbiamo assegnato e in modo semplice possiamo scorrerle 
sempre in un certo modo (tipico ciclo for).
Negli array associativi le chiavi sono stringhe e se noi prendiamo un 
criterio univoco di ordinamento possiamo in modo altrettanto certo 
enumerare gli elementi dell'array in un certo ordine.
Il fatto di attraversare gli elementi degli array (normali, o 
associativi) in un certo ordine non dipende dagli array stessi ma da 
come noi "ricordiamo" ed enumeriamo le chiavi.
Come ho scritto nel secondo paragrafo, io ho sempre *dato per scontato* 
ma in effetti non ho un definizione di array associativa e ciò che io do 
per scontato è solo frutto della mia esperienza e pertanto *non è per 
nulla scontato!*
Ciò che ho detto è basasto solo su mie congetture. L'importante 
ovviamente è sapere con cosa si ha a che fare, come si comporta una 
certo tipo di dati, indipendentemente dal nome che gli diamo. Il 
problema di dare lo stesso nome alla stessa cosa è un problema di 
comunicazione: rischiamo di non capirci l'un l'altro (maledizione alla 
torre di Babele! :-P)
Se qualcuno ha una definizione "autorevole" di array associativo si 
faccia avanti.
Ciao.
	-Ema-

 il puntatore di suo non lo sa.
[cut]
Il C e' un discorso a parte,cosi' come potrebbe esserlo l'assembly..
perche' a questo punto potremmo ridurre il tutto a locazioni di memoria e
byte e la discussione perderebbe senso :) Il nostro piano e' un po' piu' di
alto livello, di quello basso.
In sostanza il discorso e' da contestualizzare. Nel concetto che tu hai di
array associativi non ci vedo nulla di sbagliato, anzi.
E' contestualizzando a Javascript, che e' un linguaggio orientato ad
oggetti basato su prototipi e non su classi, che il discorso diventa
nebuloso.
Nei linguaggi orientati ad oggetti basati su classi, questo problema
generalmente non si pone; non si confonde un'instanza di un oggetto con un
array associativo.
Quindi i casi sono due:
O uno considera tutti gli oggetti di JS derivanti da array associativi;
oppure se vuole considerare le due diverse notazioni (dot notation e square
bracket notation) per referenziare le proprieta' di un oggetto, una delle
quali e' similare a quella degli array associativi; e quindi ci da' la
possibilita' di utilizzare un oggetto "a mo' " di array associativo.
Come ormai si e' capito :) io la penso nel secondo modo. Ovvero, e' una
questione di notazione.
Perche' vi sono oggetti JS dove non posso rimuovere o ridefinire una
proprieta'/metodo' (o "chiave" se vogliamo dirla nel modo degli array
associativi); mentre negli array associativi tali azioni devono essere
consentite (al di la' della conta o dell'ordinamento).
-- 
ZER0
~ The Tangent Universe collapsed 5932 days, 8 hours, 45 minutes and 38 seconds ago.

orsopoeta wrote:

Stai utilizzando in tuo oggetto in modo non ortodosso. Ad esempio:
var a = [1, 2, 3];
a["Pippo"] = "Pluto";
// oppure si poteva fare: a.Pippo = "Pluto";
dà lunghezza 3. Ovvero la lunghezza è il numero successivo
all'indice maggiore dell'array. La proprietà "Pippo" non
contribuisce ad aumentarne la lunghezza.
Quindi: hai dichiarato a come un array, ma un array rimane sempre
un oggetto e quindi a riga 3 stai semplicemente impostando una proprietà
dell'oggetto (vedi altri post del thread).
Se vuoi sapere il numero di proprietà dell'oggetto puoi fare:
function count(obj)
{
   var n = 0;
   for (var i in obj)
     n++;
   return n;
}
alert(count(disney));
Gaetano

Mi sa che mi hai convinto...
In effetti io sto dicendo che poichè una cariola può essere definita 
come: "mezzo per trasporto per materiale con una ruota"
e poichè un'automobile può trasportare materiale e ha certamente una 
ruota (normalmente 5) allora possiamo vederla come una cariola :-D
No. L'automobile è un automobile, la cariola è una cariola. Il fatto che 
io possa trasportare materiale con entrambe e che abbiano tutte e due 
almeno ruota non le rende la stessa cosa (salvo facili battute per auto 
non particolarmente belle) ne una un sottoinsieme dell'altra.
Si. Sono daccordo con te.
Ciao.
	-Ema-

 }
e' tutto chiaro
grazie a tutti, e per la discussione *chiarificatrice*
Rob

Tu hai sicuramente ragione data la conoscenza e l'esperienza del linguaggio,
ma ci sono diverse guide di Javascript (alcune scritte anche da docenti
universitari) che usano proprio l'espressione "array associativi" e lo
spiegano come un tipo proprio del Javascript.
Un esempio lo puoi trovare a questo URL:
http://academ.hvcc.edu/~kantopet/javascript/index.php?page=using+js+arrays&parent=js+arrays
Io stesso ho utilizzato la struttura in senso associativo dopo aver letto
queste pagine.
Saluti


http://academ.hvcc.edu/~kantopet/javascript/index.php?page=using+js+arrays&parent=js+arrays
Che non e' molto chiaro :-)
Dice: "you can also assign values associated with with string values
that serve as the index for the element instead of a number. Assigning
an element value this way will place it in the next available open
slot." 
Quale slot? Non certo variabilearray[x] con x numerico a definire il
primo slot disponibile.
La parte che inizia con "In order to work with array values you need
to refer to the array elements and not the array itself." e' messa
sotto "Associative Arrays" come se ne facesse parte, ma non e' vero
visto che e' valida per tutti gli array. Non ha senso solo per quelli
associativi anche perche' crea confusione se fai paragoni, ad esempio,
con Perl:
definisce
var aName = Array(1, 'cat', 2, 'dog');
e vi accede ovviamente con
if (aName[3] == 'dog')
dato che non e' un array associativo, anche se ne parla "sotto" array
associativi
in Perl se definisco un array associativo con
my %a=("a","aa","b","bb");
ho una cosa completamente diversa, dato che a e b sono le keys e aa e
bb sono i values.
Questo script 
my %a=("a","aa","b","bb");
while ((my $key, my $val) = each(%a)){
 	print $key, '=', $val,"\n";
}
print '$a{"a"}=',$a{"a"},"\n";
fornisce in output
a=aa
b=bb
$a{"a"}=aa
'bye

 tutta una serie di script per la composizione di un menu'.
esatto :P
-- 
artemis.alpeia

 Io stesso ho utilizzato la struttura in senso associativo 
Questo va bene: Io non sto contestando la natura "associativa" che hanno
gli oggetti Javascript con la square bracket notation; bensi' il
confonderli come "Array Associativi" intesi come tipo di oggetto.
-- 
ZER0
~ The Tangent Universe collapsed 5937 days, 2 hours, 42 minutes and 45 seconds ago.