2016-10-02 59 views
1

如何定位名稱與變量值相等的數組?

// here goes random number generator 
 

 
// arrays with info 
 

 
foo1 = ["This is true!", true, false]; 
 
foo2 = ["This is false!", false, false]; 
 
foo3 = ["This is probably false!", false, false]; 
 
foo4 = ["This is probably true!", true, false]; 
 
foo5 = ["This might be true!", true, false]; 
 

 
// choosing a random array name 
 

 
fooID = "foo" + randomNumber(1, 5); 
 

 
/* How would I make this work? - 
 

 
alert(<value of fooID>[0]); 
 
<value of fooID>[2] = true; 
 

 
*/

我試圖做的是選擇一個隨機陣列(所有被命名爲foo__),然後用它做什麼。

也許我甚至可以用完全不同的方式來定位數組,甚至不需要fooID變量?我在StackOverflow中找到了looked around,發現我應該使用字典,但我不知道如何。

回答

4

你可以使用簡單的Array,因爲你的數據是可迭代的,你需要一個隨機數來得到結果。

function getRandomElement(array) { 
 
    return array[Math.floor(Math.random() * array.length)] 
 
} 
 

 
var foos = [ 
 
     ["This is true!", true, false], 
 
     ["This is false!", false, false], 
 
     ["This is probably false!", false, false], 
 
     ["This is probably true!", true, false], 
 
     ["This might be true!", true, false] 
 
    ], 
 
    i; 
 

 
for (i = 0; i < 10; i++) { 
 
    console.log(getRandomElement(foos)[0]); 
 
}
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

雖然這是一個很好的解決方案,但它沒有意識到OP可能不知道括號記號。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Property_Accessors#Bracket_notation – connexo

+1

,而與窗口對象組合的括號表示法可能是一種解決方案,它僅適用於具有窗口對象的系統並且只在全局變量上工作。所以對於自變量使用windows括號表示法並不是一個好的解決方案,應該在任何可能的情況下避免它,這意味着無論如何。 –

+0

'窗口'上下文是唯一適用於a)瀏覽器和b)在這個微不足道的例子。這並不會降低該方法的動態訪問對象屬性的有效性。 – connexo

2

您可以使用bracket notation,作爲變量是全局定義,window[/* array variable identifier */]

// here goes random number generator 
 

 
// arrays with info 
 

 
foo1 = ["This is true!", true, false]; 
 
foo2 = ["This is false!", false, false]; 
 
foo3 = ["This is probably false!", false, false]; 
 
foo4 = ["This is probably true!", true, false]; 
 
foo5 = ["This might be true!", true, false]; 
 

 
// choosing a random array name 
 

 
fooID = window["foo" + 1 /* randomNumber(1, 5) */ ]; 
 

 
console.log(fooID);

1

基本上你想可以用brackets property notation來實現,因爲什麼你可以讓我們e變量或屬性名稱內的任何其他有效的JS表達式元素。

在您的示例中,foo1到foo6作爲變量存在於全局名稱空間中,這意味着它們全都附加到瀏覽器中的window對象。

所以存儲要在一個變量來訪問變量的名稱,你可以例如命名accessor,然後像這樣訪問相應的變量:

window[accessor] 
// here goes random number generator 

// arrays with info 

foo1 = ["This is true!", true, false]; 
foo2 = ["This is false!", false, false]; 
foo3 = ["This is probably false!", false, false]; 
foo4 = ["This is probably true!", true, false]; 
foo5 = ["This might be true!", true, false]; 

// choosing a random array name 

fooID = window["foo" + 3 /*randomNumber(1, 5)*/]; 

/* How would I make this work? - 

alert(<value of fooID>[0]); 
<value of fooID>[2] = true; 

*/ 
2

也許我甚至可以以完全不同的方式瞄準陣列,

var foo = [ 
 
    ["This is true!", true, false], 
 
    ["This is false!", false, false], 
 
    ["This is probably false!", false, false], 
 
    ["This is probably true!", true, false], 
 
    ["This might be true!", true, false] 
 
]; 
 

 
var fooItem = foo[Math.trunc(Math.random()*5)]; 
 
console.log(fooItem);

事實上,就使一個陣列內的陣列。

相關問題