【问题标题】:How to create an obj with multiple values and randomly choose values without repeating in jQuery/JS如何创建具有多个值的 obj 并随机选择值而不在 jQuery/JS 中重复
【发布时间】:2014-12-11 03:47:09
【问题描述】:

这是创建和obj存储多个值的方式吗,如果是,如何随机选择两个或三个值而不重复,直到从数组中输出所有值?

我想随机获取这样的值

例如,如果第三行是随机选择的,那么结果应该是;

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" } ]                                                
};

如果我决定一次只输出一个值,我该怎么做?

【问题讨论】:

    标签: javascript jquery arrays random


    【解决方案1】:

    目前,如果第三行是随机选择的,它将输出一个包含一个条目(您的对象)的数组,如下所示:

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

    我们可以只使用数组和 Fisher-Yates 函数,可以在这里找到: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;
    }
    

    如果您需要与值关联的键,只需使用对象数组即可。我们可以只使用数组中对象的索引,而不是使用“一”、“二”、“三”等来标识每个集合。例如:

    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];
    }
    


    如果您不需要与值关联的键,即“a”和“aa”,并且您只想从值中随机选择,则可以使用数组和 Fisher-Yates (aka Knuth) Shuffle 函数。

    例如:

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

    然后我们可以将它应用到数组中

    shuffle(list)
    

    我们会得到一个具有相同值(不重复)的数组,该数组是随机的并且可以迭代。

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

    如果您需要将值组合在一起但不需要键,即您需要始终一起返回 'aa'、'bb'、'cc',您可以使用数组数组 AKA 多维数组。

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

    如果我们运行 sorted 函数以及一些额外的代码,我们可以获得三个值

    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 循环遍历数组中的项目以获取每个值。

    【讨论】:

    • 我实际上确实需要与值关联的键,而我试图做的是创建嵌套数组,即在列表 obj 中有五个数组。随机输出嵌套数组,例如,像这样输出第一行/嵌套数组;一:a -> aa, b -> bb, c -> cc。
    • 即,我想随机输出一个数组及其值,这就像一个问题的三个提示,因此,用户必须输入答案,然后比较值以查看它是否火柴。我该怎么做?
    • 我不明白为什么您需要使用数组作为输出,只需使用嵌套在数组中的对象即可。如果键(“一”、“二”、“三”等)只是随机选择的选项,则使用键/值方案不会获得任何收益。您可以使用我上面发布的数组索引。
    • 要使用shuffle函数,我需要得到Fisher-Yates函数对吗?
    • 这只是我在主帖中发布的函数的名称。链接的 github 有更多信息,但是我发布的“shuffle”功能将完成我概述的所有操作。这有更多信息:stackoverflow.com/questions/2450954/…
    猜你喜欢
    • 2013-08-13
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多