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

试试splice数组的方法。

演示在http://jsfiddle.net/WKEC2/1/

于 2012-08-13T19:05:39.497 回答
0

像 document.getElementById('change-world-btn').onclick 这样的东西不存在。你做了一些类似的事情并且在你的javascript中是这样的:

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

或者,您可以对数组进行随机排序,然后简单地循环遍历它:

// 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 回答