2012-05-28 10 views
6

Tengo una matriz con elementos anónimos. Los elementos se añaden a la matriz a través de PHP, así:Looping a través de una matriz y salida por pares (divisor por cada segundo elemento)

$playlist = array(); 

while (databaseloop) { 
    $playlist[] = $a_title; 
    $playlist[] = $a_length; 
} 

echo json_encode(array('playlist'=>$playlist)); 

Así que la matriz se convierte en:

["Hello.mp3", "00:00:14", "Byebye.mp3", "00:00:30", "Whatsup.mp3", "00:00:07", "Goodnight.mp3", "00:00:19"] and so on 

Entonces recuperar esta matriz en jQuery con el Ajax puesto. Todo lo que funciona bien.

Ahora, estoy buscando una forma de tratar/dar salida a todos los elementos de la matriz como pares en javascript/jquery. "hacer algo" para cada segundo elemento. De esta manera:

foreach (two_elements_in_array) { 
    // output track name 
    // output track time 
    // output some divider 
} 

¿Cómo se puede hacer esto?

Respuesta

6

Bueno, tal vez esta es la solución más básica:

for (var i = 0; i < arr.length; i += 2) { 
    var title = arr[i]; 
    var len = arr[i+1]; 
} 

Sin embargo, yo recomendaría usted para concertar $playlist de la siguiente manera:

while (databaseloop) { 
    $playlist[] = array(
     "title" => $a_title, 
     "length" => $a_length 
    ); 
} 

Entonces será fácil repetir los elementos simplemente con:

for (var i = 0; i < arr.length; i++) { 
    var title = arr[i]['title']; 
    var len = arr[i]['length']; 
} 
+0

Smooth. Gracias – mowgli

0

No con foreach.

for (var i = 0; i < array.length; i += 2) { 
    var name = array[i]; 
    var time = array[i + 1]; 
    // do whatever 
} 
+0

¿Qué significa "no con foreach"? –

+0

Significa que 'foreach' no es la construcción apropiada para usar en esta situación. – lanzz

0

Un bucle simple con un incremento de dos. Es posible que desee asegurarse de que la longitud de su matriz sea lo suficientemente larga para i + 1, en caso de que la longitud no sea divisible por 2.

for (i = 0; i+1 < array.length; i+=2) { 
    name = array[i]; 
    length = array[i+1]; 
} 
0
var arr = ["Hello.mp3", "00:00:14", "Byebye.mp3", "00:00:30", "Whatsup.mp3", "00:00:07", "Goodnight.mp3", "00:00:19"]; 

var group = []; 
for (var x = 0; x < arr.length; x += 2) { 
    var track = arr[x], 
     length = arr[x + 1]; 
    group.push({ 
     track: track, 
     length: length 
    }) 
} 
0

como @VisioN dijo que sería más fácil si utiliza matriz asociativa o de lo contrario puede tener una matriz separada de etiquetas, mientras que la iteración en el lado del cliente

var d=["Hello.mp3", "00:00:14", "Byebye.mp3", "00:00:30", "Whatsup.mp3", "00:00:07", "Goodnight.mp3", "00:00:19"] ; 
var e=["name","time"]; 
var c=0; 
$.each(d,function(i,j){ 
    if(c>=2)c=0; 
    console.log(e[c]+j); 
    c++; 
}); 

http://jsfiddle.net/FmLYk/1/

0

Sugiero que optimice su código un poco más para que tenga más sentido y sea menos propenso a errores, si es posible. ¡Esta es también una gran manera de estar más orientado a objetos!

gusta esta (estoy usando jQuery aquí):

var array = [ {name: "Hello.mp3", time: "00:00:14"}, {name: "Byebye.mp3", time:"00:00:30"}, {name: "Whatsup.mp3", time: "00:00:07"}, {name: "Goodnight.mp3", time: "00:00:19"}]; 

, entonces sería capaz de bucle sobre ella y producir un poco más limpia en busca de código

array.forEach(function(data){ 
    //edit the output here 
    console.log(data.name + " " + data.time); 
}); 
2

Se podría dividir el matriz en una matriz de matrices de dos elementos.

var arr = ["Hello.mp3", "00:00:14", "Byebye.mp3", "00:00:30", "Whatsup.mp3", "00:00:07", "Goodnight.mp3", "00:00:19"]; 
arr.map(function(elem,i,arr){return [elem, (i+1<arr.length) ? arr[i+1] : null];}) 
    .filter(function(elem,i){return !(i%2);}); 
0

destructiva, pero limpio:

while (arr.length) { 
    const Title = arr.shift(); 
    const Length = arr.shift(); 

    // Do work. 
} 
0

Usando Array.prototype.reduce():

let pairs = playlist.reduce((list, _, index, source) => { 
    if (index % 2 === 0) { 
     list.push(source.slice(index, index + 2)); 
    } 
    return list; 
}, []); 

Esto le da una matriz de 2 dimensiones pairs a trabajar.

Cuestiones relacionadas