2012-08-13 62 views
3

我一直在玩隨機數組的安排,並想知道是否有辦法只從數組中拉出單詞一次。所以每次點擊changeWorld按鈕時,它都會從數組列表中隨機抽取,直到所有單詞只使用一次?使用隨機數組的JavaScript

學習JavaScript,所以我不需要任何人給我寫的代碼,只是想在正確的方向被推並且知道它是否possable。我無法找到解決這個概念的任何問題。

<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> 
+0

這是絕對有可能的,但我沒有看到任何你的代碼錯誤。有問題嗎?你想重構建議嗎? – Linuxios 2012-08-13 19:02:35

+0

@Linuxios:代碼隨機挑選的話,但沒有什麼是不斷被重複的單詞。 – Guffa 2012-08-13 19:04:04

+1

[隨機化(http://stackoverflow.com/a/11940592/908879)整個陣列,然後從該陣列的端部拾取更好。這裏是一個例子http://jsfiddle.net/4zEuh/(如果你好奇爲什麼從尾巴開始,那是因爲如果你從頭開始移除,整個數組每次都會將每一項移動到左側) – ajax333221 2012-08-13 21:27:10

回答

6

刪除您已經從陣列中使用的詞彙:

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

您還可能要檢查,如果數組是空的第一個。

+1

請注意,splice不僅返回一個數組,而且返回一個數組。 – 2012-08-13 19:05:19

+0

謝謝你,就簡單多了,然後以爲會在...拼接讀了... – Jeff 2012-08-13 19:16:52

+0

@AndreasKöberle:請注意,代碼不使用'splice'調用的返回值。 – Guffa 2012-08-13 20:08:57

4

這聽起來像一個堆棧或隊列中的作業。你可以把你的陣列,洗牌,讓您的「隨機性」,從你的陣列到堆棧或隊列推的每個元素,然後彈出關閉元素每次用戶點擊您的按鈕。 編輯:這是一個小例子。

var stack=new Array(); 
stack.push("A"); 
stack.push("B"); 
stack.push("C"); 
alert(stack.pop()); 
alert(stack.pop()); 
alert(stack.pop()); 
+0

+1 this是最好的方法,但它應該是一個更好的例子。 – ajax333221 2012-08-13 21:18:12

0

你可以使用splice陣列刪除單詞:

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

這種類似的document.getElementById事情( '變化世界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; 
    } 
} 
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> 
+0

將數組與字符串進行比較可能實際上有效,但不容易明白原因。請改爲檢查長度:'if(worlds.length == 0)'。 – Guffa 2012-08-13 20:13:26

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 DEMO