2014-12-11 8 views
1

這是創建和obj存儲多個值的方式,如果是這樣,您將如何隨機選擇兩個或三個值而不重複直到所有的值都是從數組中輸出的?如何用多個值創建一個obj而不用jQuery/JS中的重複值來選擇值

我想隨機得到這樣

例如值,如果三個連續被隨機選擇那麼結果應該是;

gg hh ee 

也就是說,我想隨機輸出一個數組,其價值觀,這將是像三個提示的問題,因此,用戶必須輸入答案,然後比較這兩個值看它是否符合。

JS

var list = { 
     "one": [ { "a": "aa", "b": "bb", "c":"cc" } ], 
     "two": [ { "d": "dd", "e": "ee", "f":"ff" } ], 
    "three": [ { "g": "gg", "h": "hh", "e":"ee" } ], 
    "four": [ { "j": "jj", "k": "kk", "l":"ll" } ], 
    "five": [ { "m": "mm", "n": "nn", "o":"oo" } ]             
}; 

並且如果我在一個時間決定只輸出一個值,我該怎麼辦呢?

回答

0

目前,如果三排隨機選擇它會輸出一個條目(你的對象),這樣一個數組:

[[object Object] { 
    e: "ee", 
    g: "gg", 
    h: "hh" 
}] 

我們可以只使用數組和費雪耶茨功能,可以發現這裏:https://github.com/coolaj86/knuth-shuffle

這應該給我們一個隨機數組的值。

function shuffle(array) { 
    var currentIndex = array.length, temporaryValue, randomIndex ; 

    // While there remain elements to shuffle... 
    while (0 !== currentIndex) { 

    // Pick a remaining element... 
    randomIndex = Math.floor(Math.random() * currentIndex); 
    currentIndex -= 1; 

    // And swap it with the current element. 
    temporaryValue = array[currentIndex]; 
    array[currentIndex] = array[randomIndex]; 
    array[randomIndex] = temporaryValue; 
    } 

    return array; 
} 

如果您需要的值相關的按鍵,只需使用對象的數組。我們可以使用數組中的對象的索引,而不是使用「one」,「two」,「three」等來標識每個集合。例如:

var list = [ 
     {"a" : "aa", "b": "bb", "c" : "cc"}, 
     {"d" : "dd", "e": "ee", "f" : "ff"}, 
     {"g" : "gg", "e": "hh", "i" : "ii"}, 
]; 

然後,我們會:

shuffle(list); 
console.log(list[0]); 

這應該給我們對象的隨機排列。每次運行時它會隨機獲得一個對象:

[object Object] { 
    e: "hh", 
    g: "gg", 
    i: "ii" 
} 
[object Object] { 
    e: "hh", 
    g: "gg", 
    i: "ii" 
} 
[object Object] { 
    a: "aa", 
    b: "bb", 
    c: "cc" 
} 

只要抓住數組中的第一項洗牌吧,list[0]後使用for-in循環來獲取值:

var randomResult = list[0]; 
for (key in randomResult){ 
console.log(randomResult[key]; 
} 


如果不需要與價值,即相關的關鍵,「一」與「AA」,而你只是想從你的價值觀隨機選擇,你可以使用一個rray和Fisher-Yates(又名Knuth)Shuffle功能。

例如:

var list = ['aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg'] 

我們可以將其應用到陣列

shuffle(list) 

,我們會得到具有相同的值(不重複),是隨機的,可以是一個數組迭代。

["cc", "ee", "bb", "gg", "aa", "ff", "dd"] 

如果您需要值組合在一起,但你並不需要的按鍵,也就是說,你需要「AA」,「BB」,「CC」總是被一起返回,你可以使用一個數組陣列和一個多維數組。

var list = [['aa', 'bb', 'cc'], ['dd', 'ee', 'ff'], ['gg', 'hh', 'ii']]; 

如果我們有一點點額外的代碼一起運行的排序功能,我們可以得到三個值

function sortedMulti(array){ 
    sorted(array); 
    return array[0] 

}; 

有了這個我們會在每次獲得一個隨機集。

["dd", "ee", "ff"] 
["aa", "bb", "cc"] 
["dd", "ee", "ff"] 
["dd", "ee", "ff"] 
["dd", "ee", "ff"] 
["dd", "ee", "ff"] 
["aa", "bb", "cc"] 
["dd", "ee", "ff"] 
["aa", "bb", "cc"] 
["dd", "ee", "ff"] 
["gg", "hh", "ii"] 
["gg", "hh", "ii"] 

這會使數組隨機化,這意味着您將在主數組的索引0處隨機設置一個數組。然後你可以返回它(像我一樣),或者用for循環遍歷數組中的項來獲取每個值。

+0

其實我需要的價值,我試圖做相關的關鍵,是建立嵌套的數組,即具有列表的obj裏面有五名陣列。隨機輸出嵌套數組,例如,輸出第一行/嵌套數組,像這樣;一:a - > aa,b - > bb,c - > cc。 – jQueryster 2014-12-11 04:14:55

+0

即,我想隨機輸出一個數組的值,這就像一個問題的三個提示,所以,用戶將不得不輸入答案,然後比較值,看看它是否匹配。我會如何做到這一點? – jQueryster 2014-12-11 04:29:08

+0

我不明白爲什麼你需要使用數組作爲輸出,只需使用嵌套在數組中的對象。如果密鑰(「一個」,「兩個」,「三個」等)只是一個隨機選擇的選項,那麼使用密鑰/值方案無法獲得任何結果。你可以像上面發佈的那樣使用數組的索引。 – Aweary 2014-12-11 04:34:02

相關問題