Newsgroup: it.comp.lang.javascript
Titolo: dimensionare array e assegnare valori dinamicamente

Devo creare un array di cui non conosco a priori gli elementi, e poi 
assegnare a tutti il valore zero. Ora faccio così:
 
var t=new Array(precedentevariabile-1);
for (var j = 0, j < precedentevariabile; j++) {
	t[j]=0;
}
 
C'è un modo più veloce? Qualcosa del tipo:
var t=[inserisci zero per un numero di volta pari a n variabile];

 Devo creare un array di cui non conosco a priori gli elementi, e poi
 
*il numero degli elementi*

 var t=[inserisci zero per un numero di volta pari a n variabile];
 
No, niente del genere che io sappia. Ma è anche vero che nella
stragrande maggioranza non è necessario. Posso chiederti qual è lo scopo
di ciò?

 di ciò?
 
Lo scopo è quello di inizializzare a zero i totali di riga e di colonna 
e di una tabella, prima di iniziare il loop che scorre all'interno degli 
elementi per sommarli.
La mia era solo una riga di esempio. Qualunque soluzione che sia buona 
dal punto di vista computazionale e dell'eleganza del codice va bene.
Grazie.

 Grazie.
 
Guarda, dovrei vedere bene il codice, ma a occhio di dire che non hai
bisogno di una cosa del genere. Intendo dire, che devi comunque scorrere
le righe e le colonne per ottenere tale somme no? Quindi non c'è motivo
di inizializzare un Array a zero, puoi tranquillamente avere un array
vuoto che popoli durante tale ciclo con il valore che ti interessa.
Magari mi è sfuggito qualche passaggio ma da quel che ho capito il ciclo
in questione devi farlo per forza, e non c'è nessun vantaggio pratico
(né tecnico) a "pre inizializzare" un array in quel modo.
 

 (né tecnico) a "pre inizializzare" un array in quel modo.
 
Se non ho capito male, tu mi stai dicendo che devo scrivere solo
 
var t=new Array(precedentevariabile-1);
 
mentre l'inizializzazione degli elementi è superflua
 
for (var j = 0, j < precedentevariabile; j++) {
     t[j]=0;
}
 
Ho provato ora in Firebug:
 
var t=new Array(1);
t[0]=t[0]+1;
alert( t[0]);
 
mi restituisce NaN, se non inserisco
 
t[0]=0;
 
prima della operazione di addizione
 
Quindi dentro il loop che scorre tutti gli elementi della tabella dovrei 
inserire una condizione che verifica che la variabile del totale sia 
stata inizializzata, qualcosa del tipo
 
t[0]=(t[0] || 0)+elemento[k];
 
 
e non mi sembra un granché... ma evidentemente ho capito male io.

 stata inizializzata, qualcosa del tipo
 
Anche, ma quell che intendevo io era un'altra cosa. Intendo dire, che tu
avrai due cicli innestati probabilmente, no? Altrimenti non avresti un
array per le somme ma una variabile sola.
Metti caso che hai una griglia e vuoi avere la somma per ogni riga di
tutti gli elementi nelle colonne. Avrai un array di somme pari al numero
di righe in questo caso. Quindi:
 
    var sum = [];
 
    for (var k = 0; k < 10; k++) {
        sum[k] = 0;
 
        for (var j = 0; j < 5; j++ {
            sum[k] += grid[k][j];
        }
    }
 
Ovviamente se ho inteso male io la casistica e questa non si applica a
te, prova a farmi capire le differenze e vedrò se c'è un approccio
migliore. Il discorso comunque è che non hai bisogno solitamente di un
ciclo di pre inizializzazione, perché già fai un ciclo per inserirne i
valori, e puoi inizializzare direttamente lì in modo più elegante e,
soprattutto performante (eviti un ciclo a priori).

      }
 
Io devo ottenere i totali di riga E di colonna. Quindi mi pare non ci 
sia altra strada se non inserire dentro il loop interno la linea di 
codice che somma gli elementi ai totali, ma prima occorre 
l'inizializzazione. Cioè:
 
       var sum = [];
 
       var sum_colonna = []
***   inizializza a 0
 
       for (var k = 0; k<  10; k++) {
           sum[k] = 0;
 
           for (var j = 0; j<  5; j++ {
               sum[k] += grid[k][j];
               sum_colonna[j] += grid[k][j];
           }
       }
 
Sbaglio?

 Io devo ottenere i totali di riga E di colonna.
 
In tal caso se hai un array di array (e non altra struttura) dovresti
avere un ciclo per la somma di righe E un ciclo per la somma di colonne.
 
Se invece vuoi usare lo stesso ciclo delle righe per sommare anche le
colonne, allora per le colonne si, devi usare l'OR, oppure avere due
cicli differenti, il primo per la prima riga, dove imposti anche la
somma per le colonne, e il secondo per tutte le righe dalla seconda in
poi, dove accumuli. Altri approcci (escludendo ES5) al momento non mi
vengono in mente.