Looping through array et output as pairs (diviseur pour chaque second élément)

J'ai un tableau avec des éléments anonymes. Les éléments sont ajoutés au tableau via php, de la manière suivante:

$playlist = array(); while (databaseloop) { $playlist[] = $a_title; $playlist[] = $a_length; } echo json_encode(array('playlist'=>$playlist)); 

Donc, le tableau devient:

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

Ensuite, je récupère ce tableau dans jquery avec ajax post. Tout cela fonctionne bien.

Maintenant, je cherche une façon de traiter / afficher tous les éléments du tableau sous forme de paires javascript / jquery. "Faire quelque chose" pour chaque deuxième élément. Comme ça:

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

Comment cela peut-il être fait?

Bien, peut-être que c'est la solution la plus simple:

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

Cependant, je vous recommanderais d'organiser $playlist comme suit:

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

Ensuite, il sera facile d'itérer les éléments simplement avec:

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

Vous pouvez diviser le tableau en un tableau de tableaux à deux éléments.

 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);}); 

Pas avec foreach .

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

Une simple boucle avec un incrément de deux. Vous voudrez peut-être vous assurer que votre longueur de matrice est assez longue pour i + 1, dans le cas où la longueur n'est pas divisible par 2!

 for (i = 0; i+1 < array.length; i+=2) { name = array[i]; length = array[i+1]; } 
 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 }) } 

Je vous suggère d'optimiser votre code un peu plus afin que cela ait un peu plus de sens et qu'il soit moins susceptible d'erreur, si cela est possible. C'est aussi un excellent moyen d'être plus orienté objet.

Comme ça (j'utilise jQuery ici):

 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"}]; 

Ensuite, vous pourrez le faire passer et produire un code plus propre

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

Comme @VisioN a dit qu'il serait plus facile si vous utilisez un tableau associatif ou bien vous pouvez avoir un tableau séparé d'étiquettes tout en itérant du côté client

 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/

Destructeur, mais propre:

 while (arr.length) { const Title = arr.shift(); const Length = arr.shift(); // Do work. }