53 votes

javascript - modifier l'ordre des éléments d'une liste HTML

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 ?

0 votes

12 votes

@Pekka Il ne semble pas qu'il utilise jQuery.

109voto

Alexey Lebedev Points 4778
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).

http://jsfiddle.net/qEM8B/

0 votes

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

0 votes

@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é.

1 votes

C'est le même nombre de caractères ;) mais tu as raison. jsbin.com/jiboxuru/3/edit

12voto

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

1voto

Stefan Gruenwald Points 494
    var list = document.getElementById("something");
    function shuffleNodes() {
        var nodes = list.children, i = 0;
        nodes = Array.prototype.sort.call(nodes);
        while(i < nodes.length) {
           list.appendChild(nodes[i]);
           ++i;
        }
    }
    shuffleNodes();

1voto

Giacomo Casadei Points 533

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>

0voto

Lumo5 Points 322

Voici une façon très simple de mélanger les cartes avec JS :

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return 0.5 - Math.random()});

http://www.w3schools.com/js/js_array_sort.asp

1 votes

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.com

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.

Powered by:

X