J'ai une liste :
<ul>
<li>milk</li>
<li>butter</li>
<li>eggs</li>
<li>orange juice</li>
<li>bananas</li>
</ul>
Comment puis-je réorganiser les éléments de la liste de manière aléatoire en utilisant javascript ?
J'ai une liste :
<ul>
<li>milk</li>
<li>butter</li>
<li>eggs</li>
<li>orange juice</li>
<li>bananas</li>
</ul>
Comment puis-je réorganiser les éléments de la liste de manière aléatoire en utilisant javascript ?
var ul = document.querySelector('ul');
for (var i = ul.children.length; i >= 0; i--) {
ul.appendChild(ul.children[Math.random() * i | 0]);
}
Ceci est basé sur Le remaniement Fisher-Yates et exploite le fait que lorsque vous ajoutez un nœud, il est déplacé de son ancien emplacement.
Les performances sont inférieures de 10 % à celles d'une copie détachée, même sur des listes volumineuses (100 000 éléments).
Pour un grand nombre d'éléments, il est recommandé de mélanger une copie de l'élément dans JS, puis de le recopier tel quel dans le DOM. DEMO - jsbin.com/jiboxuru/1/edit
@vsync merci pour l'édition, mais je l'ai annulée, car la boucle n'a pas besoin d'être complétée par "+ 1". children.length
. L'arrondi length
vers le bas donne l'indice le plus élevé.
Pour faire simple, voici ce qu'il en est :
JS :
var list = document.getElementById("something"),
button = document.getElementById("shuffle");
function shuffle(items)
{
var cached = items.slice(0), temp, i = cached.length, rand;
while(--i)
{
rand = Math.floor(i * Math.random());
temp = cached[rand];
cached[rand] = cached[i];
cached[i] = temp;
}
return cached;
}
function shuffleNodes()
{
var nodes = list.children, i = 0;
nodes = Array.prototype.slice.call(nodes);
nodes = shuffle(nodes);
while(i < nodes.length)
{
list.appendChild(nodes[i]);
++i;
}
}
button.onclick = shuffleNodes;
HTML:
<ul id="something">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
<button id="shuffle" type="button">Shuffle List Items</button>
Démonstration : http://jsbin.com/itesir/edit#preview
Utilisez ceci :
function htmlShuffle(elem) {
function shuffle(arr) {
var len = arr.length;
var d = len;
var array = [];
var k, i;
for (i = 0; i < d; i++) {
k = Math.floor(Math.random() * len);
array.push(arr[k]);
arr.splice(k, 1);
len = arr.length;
}
for (i = 0; i < d; i++) {
arr[i] = array[i];
}
return arr;
}
var el = document.querySelectorAll(elem + " *");
document.querySelector(elem).innerHTML = "";
let pos = [];
for (let i = 0; i < el.length; i++) {
pos.push(i);
}
pos = shuffle(pos);
for (let i = 0; i < pos.length; i++) {
document.querySelector(elem).appendChild(el[pos[i]]);
}
}
htmlShuffle("ul");
<ul>
<li>milk</li>
<li>butter</li>
<li>eggs</li>
<li>orange juice</li>
<li>bananas</li>
</ul>
Ce tri est biaisé, toutes les permutations d'éléments n'ont pas la même probabilité. Plus d'informations ici : bost.ocks.org/mike/algorithmes/#shuffling
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Duplication possible de jquery déplacer des éléments dans un ordre aléatoire
12 votes
@Pekka Il ne semble pas qu'il utilise jQuery.