2017-06-04 24 views
0

我有12個陣列名爲f1f12每個有五個項目。我想隨機從每個陣列中拉出一個項目,並將它們推入新陣列sm1拉多個陣列中的隨機項目

var sm1 = []; 

for (var i=1; i<=12; i++) { 
    randomPrompt = Math.floor((Math.random() * 5)); 
    sm1.push("f"+i[randomPrompt]); 
} 

然而,該返回的"f"+i隨機索引代替它索引f1f2f3f4,的等

+0

無論何時您發現自己創建這樣的數值變量,您應該使用數組。 – Barmar

+0

感謝您的提醒。是的,在這種情況下,f1到f12變量名稱是特定於我正在使用的上下文和交叉引用課程內容的。使用它們將允許非編碼人員必須調整它來知道哪些位需要調整。 –

回答

0

有幾個方法來完成你的要求。

例子:

var myArray = { 
 
    "f1": [1,2,3,4,5], 
 
    "f2": [6,7,8,9,10], 
 
    "f3": [11,12,13,14,15], 
 
    "f4": [16,17,18,19,20] 
 
} 
 

 
var sm1 = []; 
 
for (var i=1; i<=4; i++) { 
 
    randomPrompt = Math.floor((Math.random() * 5)); 
 
    sm1.push(myArray["f"+i][randomPrompt]); 
 
} 
 
console.log(sm1);

,或者,如果你在瀏覽器中使用代碼:

f1 = [1,2,3,4,5]; 
 
f2 = [6,7,8,9,10]; 
 
f3 = [11,12,13,14,15]; 
 
f4 = [16,17,18,19,20]; 
 

 
var sm1 = []; 
 

 
for (var i=1; i<=4; i++) { 
 
    randomPrompt = Math.floor((Math.random() * 5)); 
 
    sm1.push(window["f"+i][randomPrompt]); 
 
} 
 
console.log(sm1);

或者使用eval()

f1 = [1,2,3,4,5]; 
 
f2 = [6,7,8,9,10]; 
 
f3 = [11,12,13,14,15]; 
 
f4 = [16,17,18,19,20]; 
 

 
var sm1 = [],item; 
 

 
for (var i=1; i<=4; i++) { 
 
    randomPrompt = Math.floor((Math.random() * 5)); 
 
    item = eval(["f"+i][0]); 
 
    sm1.push(item[randomPrompt]); 
 
} 
 
console.log(sm1);

+0

謝謝阿里。非常全面。感謝您添加不同的版本,因爲它可以幫助我看到其他方法。第二個工作正常,並且最接近我使用的代碼。 –

3

爲什麼不使用2 d陣列而不是12個單陣列。那麼這將是非常容易的。

0

您可以使用窗口對象。

var sm1 = []; 

for (var i=1; i<=12; i++) { 
    randomPrompt = Math.floor((Math.random() * 5)); 
    sm1.push(window["f"+i][randomPrompt]); 
} 
+1

這隻適用於全局變量。 – Barmar

+0

如果不是全局的,你可以'this'或者當前的作用域。 –

+0

我實際上是在代碼中的這一點全局工作,所以這是適當的。我感謝你的警告,儘管@Barmar。 –

1

變化如下行

sm1.push("f"+i[randomPrompt]); 

sm1.push(eval("f"+i+"["+randomPrompt+"]")); 
0
var sm1 = [f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12].map(function (arr) { 
    return arr[Math.floor((Math.random() * arr.length))]; 
}); 

我投票使用2- d陣列而不是命名12個單個陣列雖然。