【问题标题】:Make sure that randomly assigned attribute is not duplicating确保随机分配的属性不重复
【发布时间】:2015-07-14 13:00:53
【问题描述】:

我有这种情况。页面上有六个不同位置的占位符。我有六个不同的词,每个词应该随机分配到一个占位符。

我想要实现的是没有重复的单词,例如占位符 nr.3 获得“Word-1”,占位符 nr.6 获得“Word-1”。

这是我用来将单词随机分配给占位符的 JavaScript,在我的例子中是段落元素。

var word_1 = $('#main').append('<p class="word word-1"></p>'),
word_2 = $('#main').append('<p class="word word-2"></p>'),
word_3 = $('#main').append('<p class="word word-3"></p>'),
word_4 = $('#main').append('<p class="word word-4"></p>'),
word_5 = $('#main').append('<p class="word word-5"></p>'),
word_6 = $('#main').append('<p class="word word-6"></p>');

var pos_1 = $('.word-1').css({'left' : '0', 'right' : '0', 'top' : '48%'})
var pos_2 = $('.word-2').css({'left' : '-400px', 'right' : '0', 'top' : '58%'})
var pos_3 = $('.word-3').css({'left' : '0', 'right' : '-400px', 'top' : '36%'})
var pos_4 = $('.word-4').css({'left' : '0', 'right' : '-320px', 'top' : '61%'})
var pos_5 = $('.word-5').css({'left' : '-500px', 'right' : '0', 'top' : '36%'})
var pos_8 = $('.word-6').css({'left' : '-320px', 'right' : '0', 'top' : '46%'})

var words = ['word-1', 'word-2', 'word-3', 'word-4', 'word-5', 'word-6'];

$('.word').each(function(){
classIndex = Math.floor(Math.random() * words.length);
$(this).text(words[classIndex]);
})

这是一个说明我想要达到的目标的小提琴。 http://jsfiddle.net/somkchza/

【问题讨论】:

  • 为什么不:设置一个包含 6 个单词的数组,将数组打乱(因此现在随机分配),然后将其分配给每个位置。
  • @TarynEast 这与我已经在做的有什么不同?请记住,我是 JS 新手。
  • 啊,不,我看到了区别。现在你正在做随机 6 次......这意味着你可能会再次得到相同的单词......如果你制作一次数组 - 然后随机化顺序......你将保证每个单词只有一次。跨度>
  • @madebym shuffle != random

标签: javascript jquery html random


【解决方案1】:

只需在循环内添加:words.splice(classIndex,1); 即可删除使用的单词:

$('.word').each(function(){
    classIndex = Math.floor(Math.random() * words.length);
    $(this).text(words[classIndex]);
    words.splice(classIndex,1);
})

【讨论】:

  • 太棒了,如此简单,但有效!!
【解决方案2】:

你需要的是打乱数组,然后将每个分配给单词。

按照你现在的做法,你会随机挑选一个单词,你可能会两次得到同一个单词。你不需要那个。

如果您对数组进行洗牌 - 每个单词只有一次,但将其洗牌以获得随机顺序。然后将每个分配到您的.word 位置

我不是在修复这个错误,也不是为你编写你的随机播放算法,而是尝试类似:

var words = ['word-1', 'word-2', 'word-3', 'word-4', 'word-5', 'word-6'];

# google how to shuffle an array and put that function somewhere
# eg https://css-tricks.com/snippets/javascript/shuffle-array/
words = Shuffle(words);

# they are already random - so now just assign each one to a place
$('.word').each(function(){
   $(this).text(words[classIndex]);
})

【讨论】:

  • 尝试了您的解决方案,但无法正常工作。似乎有一个更优雅的解决方案splice
  • 注意:我告诉过你我没有修复它。 splice 是另一种解决方案......但它不是最优雅的。您不需要每次都删掉一个单词,只需遍历它们并一次将它们分配给您需要的东西
猜你喜欢
  • 2020-12-19
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 2013-02-14
  • 2011-03-06
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多