3

私はランダムな配列の配置で遊んでいて、配列から単語を一度だけ引き出す方法があるかどうか疑問に思っていました。changeWorld ボタンをクリックするたびに、すべての単語が一度だけ使用されるまで、配列リストからランダムに描画されますか?

JavaScript を学んでいるので、誰かにコードを書いてもらう必要はありません。正しい方向に押し進めて、それが可能かどうかを知りたいだけです。コンセプトに対処するものは何も見つかりません。

<body>

<button id="change-world-btn">Change World</button>

Hello <span class="world-name">World!</span><br />



<script type="text/javascript">

var worlds = new Array ("Pluto", "Mars", "Saturn", "Jupiter", "Uranus");

function newWorld() {
    return worlds[Math.floor(Math.random() * worlds.length)];
}

elements = document.getElementsByTagName('span');

document.getElementById('change-world-btn').onclick = function() {
    world = newWorld();
    for(var i = 0, el; el = elements[i++];) {
        if(el.className == 'world-name') {
            el.innerHTML = world;
        }
    }
};
</script>       
</body>
4

7 に答える 7

6

使用した単語を配列から削除します。

function newWorld() {
  var index = Math.floor(Math.random() * worlds.length);
  var world = worlds[index];
  worlds.splice(index, 1);
  return world;
}

最初に配列が空かどうかを確認することもできます。

于 2012-08-13T19:02:10.027 に答える
4

これは、スタックまたはキューのジョブのように聞こえます。配列を取得し、シャッフルして「ランダム性」を取得し、配列から各要素をスタックまたはキューにプッシュしてから、ユーザーがボタンをクリックするたびに要素をポップオフできます。編集:これはスタックの小さな例です。

var stack=new Array();
stack.push("A");
stack.push("B");
stack.push("C");
alert(stack.pop());
alert(stack.pop());
alert(stack.pop());
于 2012-08-13T19:00:37.243 に答える
1

これは非常にうまく機能し、配列が使い果たされるとリターン フレーズが発生します。

すべての助けに感謝します。

<button id="change-world-btn">Change World</button>

Hello <span class="world-name">World!</span><br />



<script type="text/javascript">
   var worlds = new Array ("Pluto", "Mars", "Saturn", "Jupiter", "Uranus");

function newWorld() { 
var index = Math.floor(Math.random() * worlds.length); 
var world = worlds[index]; 
worlds.splice(index, 1); 
return world; 
} 


elements = document.getElementsByTagName('span');

document.getElementById('change-world-btn').onclick = function() {
    world = newWorld();
    if(worlds==""){ world="no more worlds"}
    for(var i = 0, el; el = elements[i++];) {
        if(el.className == 'world-name') {
            el.innerHTML = world;
        }
    }
};
    </script>       


</body>
于 2012-08-13T19:25:59.550 に答える
0

次を使用して、配列から単語を削除できますsplice

function newWorld() {
    var i = Math.floor(Math.random() * worlds.length)
    return worlds.splice(i , 1)[0];
}
于 2012-08-13T19:03:41.417 に答える
0

document.getElementById('change-world-btn').onclick のようなものは存在しません。あなたは次のようなことをしました

function getNewName(){
document.getElementById('yourelementid').innerHtml = newWorld();
}

すべての要素でそれを行いたい場合は、次のようにしてください。

document.getElementById('change-world-btn').onclick = function() {
world = newWorld();
for(var i = 0, i < elements.lenght; el = elements[i++];) {
    if(el.className == 'world-name') {
        el.innerHTML = world;
    }
}
于 2012-08-13T19:11:30.080 に答える
0

splice配列の方法を試してください。

http://jsfiddle.net/WKEC2/1/のデモ

于 2012-08-13T19:05:39.497 に答える
0

または、配列をランダムに並べ替えてから、単純に循環させることもできます。

// Math.random() returns a number between 0-1
// Math.round() rounds the number to either 0 or 1
// Subtracting 0.5 results in either +.5 or -.5
function randomSort(){
    return (Math.round(Math.random())-0.5);
}


var elements = document.getElementsByTagName('span');  
var worlds = new Array ("Pluto", "Mars", "Saturn", "Jupiter", "Uranus");

// sort the array
worlds.sort(randomSort);

document.getElementById('change-world-btn').onclick = function() {
    world = worlds.shift();
    //worlds.push(world); - add this line if you want to cycle the array indefinitely
    if(!world) { // check to make sure world exists
        alert('No more worlds!');
    } else {
        for(var i = 0, el; el = elements[i++];) {
            if(el.className == 'world-name') {
                el.innerHTML = world;
            }
        }
    }
};

jsFiddle デモ

于 2012-08-13T19:26:32.340 に答える