View Full Version : [generico]ciclo for scartare indici
RaouL_BennetH
30-10-2013, 10:04
Salve a tutti, ho questo piccolo problema:
all'interno di un array, devo "prendere" l'indice corrente e "buttare" tutti gli altri.
personalmente devo utilizzare javascript, ma un ciclo è un ciclo, quindi un suggerimento in qualsiasi modo mi va già benone.
Sto ragionando così:
var index = someIndex;
var myArray = someArray();
for(var i = 1; i < myArray.length; i++) {
if(myArray[i] === index) {
myArray.splice(i, 1);
}
miaFunzione(myArray[i]).doSomething();
}
Questo mi va bene se parto da un "index" più basso a salire..
Ovviamente, se faccio al contrario, non funziona nulla, mi spiego:
ho sul form 10 oggetti;
i dieci oggetti fanno parte del mio array;
ovviamente ogni oggetto ha il suo index;
se inizio ad usare gli oggetti in modo crescente, tutto funziona come mi aspetto;
se parto dall'ultimo o comunque "conto" a decrescere, non funziona nulla.
Grazie a tutti.
Con quel codice tu butti l'oggetto con l'indice corrente non gli altri.
La splice ti rimuove l'oggetto corrente dall'array e ti restituisce l'array senza quell'oggetto. Quindi chiami la funzione su un oggetto sbagliato.
Col for al contrario di conseguenza chiami la funzione su un oggetto sbagliato o addirittura non più esistente :)
RaouL_BennetH
30-10-2013, 10:30
Con quel codice tu butti l'oggetto con l'indice corrente non gli altri.
La splice ti rimuove l'oggetto corrente dall'array e ti restituisce l'array senza quell'oggetto. Quindi chiami la funzione su un oggetto sbagliato.
Col for al contrario di conseguenza chiami la funzione su un oggetto sbagliato o addirittura non più esistente :)
Allora ok, mi sono espresso e capito male da solo :)
In effetti a me è proprio ciò che serve. Tolgo l'oggetto corrente dall'array.
Ciò mi serve perché solo l'oggetto che ho tolto deve poter eseguire la funzione e non tutti gli altri.
Riordian
30-10-2013, 10:59
per prendere l'oggetto rimosso credo che dovresti fare una cosa tipo questo:
var removedArray = myArray.splice(i, 1);
miaFunzione(removedArray[0]).doSomething();
così dovresti chiamare la funzione solo per quell'elemento. la funzione splice ti restituisce un array con gli elementi rimossi se non sbaglio
oltretutto mi sorprende che il for, anche a crescere, funzioni...
Eh ok ma non riesco a capire perché lo rimuovi dall'array e poi ci chiami la funzione. Chiama la funzione e poi lo rimuovi.
Se fai il for al contrario devi stare attento, dato che lo rimuovi...array[i] non esiste più.
per prendere l'oggetto rimosso credo che dovresti fare una cosa tipo questo:
var removedArray = myArray.splice(i, 1);
miaFunzione(removedArray[0]).doSomething();
così dovresti chiamare la funzione solo per quell'elemento. la funzione splice ti restituisce un array con gli elementi rimossi se non sbaglio
No la splice ti ritorna l'array originale (con oggetti aggiunti o oggetti rimossi)
Riordian
30-10-2013, 11:03
No la splice ti ritorna l'array originale (con oggetti aggiunti o oggetti rimossi)
no ti cambia l'array e ti restituisce i rimossi ;)
http://www.tutorialspoint.com/javascript/array_splice.htm
Scusate avete ragione. Ritorna il nuovo array con elementi aggiunti oppure l'array con gli oggetti rimossi. MI son confuso ;)
Riordian
30-10-2013, 11:08
comunque io, se la necessità è quella di chiamare la funzione solo per quell'elemento, farei così:
var index = someIndex;
var myArray = someArray();
for(var i = 1; i < myArray.length; i++) {
if(myArray[i] === index) {
miaFunzione(myArray[i]).doSomething();
myArray.splice(i, 1);
}
}
tanto sei già nel ciclo for... :)
Riordian
30-10-2013, 11:12
Eh ok ma non riesco a capire perché lo rimuovi dall'array e poi ci chiami la funzione. Chiama la funzione e poi lo rimuovi.
Se fai il for al contrario devi stare attento, dato che lo rimuovi...array[i] non esiste più.
infatti a me stupisce che funzioni nel for a salire anche perchè ormai l'oggetto è rimosso :)
Oltretutto credo che se sei nell'ultimo elemento dell'array va pure in eccezione un ciclo del genere percè i diventerebbe uguale a array.length per cui sei fuori dall'indice max che è array.length-1
RaouL_BennetH
30-10-2013, 11:16
Scusatemi tutti ma sono io che sto generando confusione :(
Allora, all'interno di una pagina ho diversi player audio. Io devo fare in modo che possa suonarne soltanto uno per volta.
l'array è composto dagli id dei players.
quindi io ho una funzione sul play:
onPlay: function() {
var pID = <?php echo json_encode($players[$count]); ?>;
var pArray = <?php echo json_encode($players); ?>;
for(var i = 0; i < pArray.length ; i++) {
if(pArray[i] === pID) {
pArray.splice(i, 1);
}
jwplayer(pArray[i]).stop();
Ora, se parto dal player0 a salire, tutto funziona bene(il player che parte ferma il successivo o successivi a salire), se parto dall'ultimo o vado a "scendere", i players suonano in contemporanea.
Mah secondo me l'approccio è sbagliato. Nel senso che tu devi bindare il play e lo stop su quello che fa l'utente. Anche perchè se l'utente fa partire l'audio/video 1 e poi vuol far partire il 5, e poi il 3 e poi il 2 e poi il 10?
Io fare così:
All'inizio son tutti spenti.
Un utente fa play? Ti tieni l'id dell'oggetto.
L'utente fa play su un altro? Non devi ciclare nulla, hai l'id del player precedente, fai stop sull'id precedente, poi modifichi l'id vecchio con quello corrente e fai play.
RaouL_BennetH
30-10-2013, 11:31
Mah secondo me l'approccio è sbaglio. Nel senso che tu devi bindare il play e lo stop su quello che fa l'utente. Anche perchè se l'utente fa partire l'audio 1 poi vuol far partire il 5?
Con il codice implementato fino ad ora qualsiasi salto, a salire, funziona bene. Cioè: faccio partire il player 1, suona, mi sposto sul 9, clicco, il player 1 si ferma e parte il 9, etc…
Io fare così:
All'inizio son tutti spenti.
Un utente fa play? Ti tieni l'id dell'oggetto.
L'utente fa play su un altro? Non devi ciclare nulla, hai l'id del player precedente, fai stop sull'id precedente, poi modifichi l'id vecchio con quello corrente e fai play.
Ok, la tua idea è giusta (partendo dal fatto che al momento sono già tutti spenti).
Non capisco però come posso non ciclare dato che non ho un numero fisso di players ma vengono caricati dinamicamente. Come posso "catturare" quindi l'id del player ?
Riordian
30-10-2013, 11:34
Scusatemi tutti ma sono io che sto generando confusione :(
Allora, all'interno di una pagina ho diversi player audio. Io devo fare in modo che possa suonarne soltanto uno per volta.
l'array è composto dagli id dei players.
quindi io ho una funzione sul play:
onPlay: function() {
var pID = <?php echo json_encode($players[$count]); ?>;
var pArray = <?php echo json_encode($players); ?>;
for(var i = 0; i < pArray.length ; i++) {
if(pArray[i] === pID) {
pArray.splice(i, 1);
}
jwplayer(pArray[i]).stop();
Ora, se parto dal player0 a salire, tutto funziona bene(il player che parte ferma il successivo o successivi a salire), se parto dall'ultimo o vado a "scendere", i players suonano in contemporanea.
ma usare un continue invece dello splice? tipo:
for(var i = 0; i < pArray.length ; i++) {
if(pArray[i] === pID) {
continue;
jwplayer(pArray[i]).stop();
}
RaouL_BennetH
30-10-2013, 11:47
ma usare un continue invece dello splice? tipo:
for(var i = 0; i < pArray.length ; i++) {
if(pArray[i] === pID) {
continue;
jwplayer(pArray[i]).stop();
}
provato, ma suonano tutti in contemporanea.
una nota: per "contemporanea" io intendo che se l'utente fa click su uno o più player si sovrappongono.
Di base sono tutti con autoplay a false.
Come ti dicevo devi bindare l'azione di play e stop sull'oggetto, tramite javascript.
Qui trovi tutti gli esempi
http://www.longtailvideo.com/support/jw-player/28850/using-the-javascript-api
http://www.longtailvideo.com/support/jw-player/28851/javascript-api-reference
Questo fa proprio al caso tuo:
http://www.longtailvideo.com/support/jw-player/29413/mutually-exclusive-playback
RaouL_BennetH
30-10-2013, 11:58
Come ti dicevo devi bindare l'azione di play e stop sull'oggetto, tramite javascript.
Ci sono le callback.
http://www.longtailvideo.com/support/jw-player/28851/javascript-api-reference
le conosco :( ma le callback sulla playlist puoi utilizzarle quando hai un unico player.
Io invece ho N player 'singoli' caricati dinamicamente.
Guarda qui:
A me pare proprio quello che vuoi tu :)
http://www.longtailvideo.com/support/jw-player/29413/mutually-exclusive-playback
RaouL_BennetH
30-10-2013, 13:08
Guarda qui:
A me pare proprio quello che vuoi tu :)
http://www.longtailvideo.com/support/jw-player/29413/mutually-exclusive-playback
Nulla da fare, dinamicamente ottengo sempre lo stesso effetto :muro:
Tuvok-LuR-
30-10-2013, 13:35
puoi fare un fiddle come questo (http://jsfiddle.net/kr7B6/1/) col tuo codice?
RaouL_BennetH
30-10-2013, 13:52
puoi fare un fiddle come questo (http://jsfiddle.net/kr7B6/1/) col tuo codice?
Grazie anche a te per l'esempio postato.
L'errore che facevo a monte è che come i players, anche i div vengono caricati dinamicamente. Dico questo perché il codice per lo "stop" veniva eseguito già all'interno del foreach php che serve appunto per i div. L'iterazione veniva quindi effettuata ogni volta per quanti div venivano caricati, un piccolo disastro quindi.
Grazie a tutti voi sono riuscito a risolvere questo problema.
Grazie a tutti ancora.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.