web-dev-qa-db-ja.com

javascript-HTMLリスト要素の順序を入れ替える

リストがあります:

<ul>
    <li>milk</li>
    <li>butter</li>
    <li>eggs</li>
    <li>orange juice</li>
    <li>bananas</li>
</ul>

JavaScriptを使用して、リストアイテムをランダムに並べ替える方法を教えてください。

39
Web_Designer
var ul = document.querySelector('ul');
for (var i = ul.children.length; i >= 0; i--) {
    ul.appendChild(ul.children[Math.random() * i | 0]);
}

これは Fisher–Yates shuffle に基づいており、ノードを追加すると、古い場所から移動されるという事実を利用します。

パフォーマンスは、巨大なリスト(10万個の要素)であっても、切り離されたコピーをシャッフルした場合の10%以内です。

http://jsfiddle.net/qEM8B/

80
Alexey Lebedev

簡単に言えば、このように:

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>

デモ: http://jsbin.com/itesir/edit#preview

11
user1385191
    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();
1

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

0
Lumo5