数组中的随机数据无重复

时间:2014-11-30 01:40:11

标签: javascript jquery html arrays random

我对此code有疑问 我只是想知道是否有一种方法可以在循环结束时重复数组。

HTML:

<div id="words" class="word"></div>  
<button>word</button>

使用Javascript:

$(function () {
    var data = {"seed": [
            {
                "num1":"title1",
                "num2":"title2",
                "num3": [ "1","2","3" ]
            },
            {
                "num1":"title3",
                "num2":"title4",
                "num3": [ "a","b","c" ]
            },
            {
                "num1":"title5",
                "num2":"title6",
                "num3": [ "d","gh","34" ]
            }
    ]};
    var conta = data.seed.length;
    var recorre = data.seed;
    //alert(conta);

    function getNumbers() {
        var jokeId = Math.floor((Math.random()*conta));
        var joke = $('.word');
        var result = data.seed[jokeId].num3;
        var categ = data.seed[jokeId].num1;
        joke.empty()
        for (var c in result) {
            var newElement = document.createElement('div');
            newElement.id = result[c];  
            newElement.innerHTML = result[c]; 
            joke.append(newElement);
        }
    }

    $( "button" ).click(function() {
        getNumbers();
    });
});

1 个答案:

答案 0 :(得分:0)

一个选项:先洗牌

@MitchWheat在上面的评论中提供了一个很好的线索。提前洗牌是一种选择:

  1. 使用Fisher-Yates shuffle随机播放data
  2. 点击每个按钮,只需遍历data并显示下一个按钮。
  3. 当你到达终点时,重新洗牌。
  4. FWIW:Fisher-Yates shuffle非常容易实现......它类似于:

    function shuffle(arr) {
      var i, j, a, b;
      for(i = arr.length - 1; i <= 1; i--) {
         j = Math.floor(Math.random() * i);
         a = arr[i];
         b = arr[j];
         arr[i] = b;
         arr[j] = a;
      }
    }
    

    第二个选项:Lazy Shuffle

    只需splice()你已经使用的那些:

    1. data复制到另一个数组copy
    2. 点击:
      1. 选择copy
      2. 的随机索引
      3. 使用var item = copy.splice(randomIndex, 1)
      4. 获取
      5. 显示项目
      6. 当您到达终点时,再次将data复制到copy
    3. 实际上,你是以某种懒惰的方式在这里做一次费舍尔 - 耶茨洗牌的 。因为您从完整数组开始,然后选择一个随机值并将其拉出(而不是交换它),然后将大小减小1,而不是递减i