1

我正试图找出一种方法,用纯JS从数组中提取随机字符串,而不让同一字符串连续出现两次。

我用的是一个随机数(随机数)从中提取随机字符串随机消息使用随机数的索引,然后将其存储在当前消息.

单击后,我将重新定义当前消息使用新的随机字符串。然后我使用如果/其他的以查看我们的上一条消息等于当前消息,如果是(不是第一次点击),我正在使用另一个如果/其他的语句来增加或减少索引,因此它返回一个唯一的字符串(另一条消息)到HTML和集合上一条消息var转换为该字符串。

否则,它将返回当前消息到HTML,并设置上一条消息等于当前消息.

功能如下:

(函数消息(){var ranNumber=数学地板((Math.random()*5)+0);var randomMsg=[“字符串一”,“字符串2”,“字符串三”,“字符串四”,“字符串5”];var currentMsg=randomMsg[Math.floor((Math.random()*5)+0)];var prevMsg=“”;document.getElementById(“intro”).innerHTML=currentMsg;document.getElementById(“intro”).onclick=函数(){var ranNum=数学地板((Math.random()*5)+0);currentMsg=随机消息[ranNum];if(prevMsg==currentMsg){var anotherMsg=“”;如果(ranNum>=0&&ranNum<4){anotherMsg=randomMsg[ranNum+1];}其他{anotherMsg=randomMsg[ranNum-1];}document.getElementById(“intro”).innerHTML=anotherMsg;prevMsg=另一条消息;//将prevMsg设置为另一个Msg}其他{document.getElementById(“intro”).innerHTML=currentMsg;prevMsg=当前消息;//将prevMsg设置为currentMsg};};})();

我还设置了一个J在这里摆弄.

虽然它有效,但我现在很想知道是否有一种更优雅的方法来编写这样的函数。另外,我要替换整个字符串,只替换单词(一、二、三等)更好吗?

任何帮助都将不胜感激。提前谢谢!

1

6个答案6

重置为默认值
2

对于可读性通用的原因阵列应该站起来外部这个功能:

var消息=[“字符串一”,“字符串2”,“字符串三”,“字符串”,“字符串5”,“string six”/*添加任意数量的值*/];

返回随机数,但是这个现在的 随机数:

函数randWithout(n,arr){var res=[];对于(var i=0;i<arr.length;i+=1){如果(i!==n){res.push(i);}}return res[Math.floor(Math.random()*(arr.length-1))];}

Arr必须是函数的参数,因为长度需要数组的。进一步一个返回随机数的函数:

函数randNumber(arr){var rand=Math.floor(Math.random()*arr.length);回报率;}

最后一个功能:

(函数消息(){var intro=文档.getElementById(“intro”);var currNumber=随机数(msg);intro.innerHTML=msg[currNumber];var clickNumber=randWithout(currNumber,msg);intro.onclick=函数(){intro.innerHTML=消息[单击数字];clickNumber=randWithout(单击数字,消息);}})()

普通可读的!

演示

2
  • 谢谢你。很容易理解。我想不出是什么return res[Math.floor(Math.random()*(arr.length-1))];尽管如此,你能解释一下吗?
    – 雷尔夫
    评论 2015年5月24日13:23
  • 函数randWithout,从数组中推送所有索引(此处为消息),除了中的索引当前编号,放入结果数组中。长度为棱长-1。这里消息数组的长度为6,结果数组的长度必须为5。例如res=[0,1,3,4,5]。这里的当前数字是2。我们不想马上把这个作为号码。数学地板(Math.random()*5)来自(0,1,2,3,4)的随机数。res[数学地板(Math.random()*(arr.length-1))]例如雷斯[3]它来自[0,1,3,4,5]4。
    – 用户3589620
    评论 2015年5月24日15:40
1

不要从数组中随机提取字符串,而是洗牌数组并按顺序提取字符串。

randomMsg.sort(function(){return Math.random()-0.5});//洗牌

如果您想保持随机消息只是.slice()它放入另一个数组:

var shuffedMsg=randomMsg.slice().sort(function(){return Math.random()-0.5});

就像洗牌一样,你可以多次洗牌以将其混合。但是打电话.sort()(排序)就像上面的例子一样,变得乏味。因此,将其封装在函数中:

函数洗牌(arr){return arr.sort(function(){return Math.random()-0.5});}var shuffledMsg=洗牌(洗牌(shuffle(randomMsg.slice()));
0

我去掉了另一个Msg,一个if子句,并使用了三元运算符:

(函数消息(){var currentMsg,prevMsg;var ranNumber=Math.floor((Math.random()*5)+0);var randomMsg=[“字符串一”,“字符串2”,“字符串三”,“字符串四”,“字符串5”];prevMsg=(prevMs g)?前一条消息:“”;var currentMsg=随机消息[ranNumber];document.getElementById(“intro”).innerHTML=currentMsg;document.getElementById(“intro”).onclick=function(){var ranNum=数学地板((Math.random()*5)+0);currentMsg=随机消息[ranNum];if(前消息===当前消息){ranNum=(ranNum===4)?0:ranNum++;currentMsg=randomMsg[ranNumber];} document.getElementById(“intro”).innerHTML=currentMsg;prevMsg=当前消息;};})();
0

我更喜欢可读性更强的方法。

(函数消息(){var introElem=文档.getElementById(“intro”);var randomMessages=[“字符串一”,“字符串2”,“字符串三”,“字符串四”,“字符串五”];var randomMessagesLength=randomMessages.length;introElem.innerHTML=获取随机消息(introElem);introElem.onclick=函数(){introElem.innerHTML=获取随机消息(introElem);};函数getRandomMessage(元素){var isNewRandMessage=false;var randMessage=“”;做{randNumber=数学地板(Math.random()*randomMessagesLength);randMessage=随机消息[randNumber];if(elem.innerHTML!=随机消息){isNewRandMessage=true;}}while(!is新随机消息);return randMessage;}})();
0

下面的代码非常简单,但可能会不断迭代,特别是在消息数量较少的情况下。如果没有至少两条消息,则会有一个无限循环。

var messages=[“string one”,“string two”,“string three”,”string four“,”string-five“];var i=-1,intro=文档.getElementById(“intro”);(intro.onclick=函数(){而(i==(i=Math.floor((Math.random()*messages.length)));intro.textContent=消息[i];})();
<h1 id=“简介”></h1>

为了避免这些问题,最好使用以下方法,即使它不太简单:

var messages=[“string one”,“string two”,“string three”,”string four“,”string-five“];var i=数学地板((Math.random()*messages.length)),intro=文档.getElementById(“intro”);(intro.onclick=函数(){intro.textContent=消息[i];var rand=Math.floor((Math.random()*(messages.length-1)));i=兰特+(兰特>=i);})();
<h1 id=“intro”></h1>

0

添加了另一个tmpMsg,在点击时将消息移动到tmpMs,在下一次迭代时将其合并回randomMsg并将最新显示的消息移到tmpM。

(函数消息(){var randomMsg=[“字符串一”,“字符串2”,“字符串三”,“字符串四”,“字符串5”];var random=函数(){return Math.floor((Math.random()*(randomMsg.length))+0);}var tmpMsg;var ranNumber=随机();var currentMsg=随机消息[ranNumber];tmpMsg=randomMsg.splice(ranNumber,1)[0];document.getElementById(“intro”).innerHTML=currentMsg;document.getElementById(“intro”).onclick=function(){ranNumber=随机();currentMsg=randomMsg[ranNumber];document.getElementById(“intro”).innerHTML=currentMsg;randomMsg.push(tmpMsg);tmpMsg=randomMsg.splice(ranNumber,1)[0];if(randomMsg.length===0){randomMsg=tmpMsg;tmpMsg=[];}};})();

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览已标记的其他问题问你自己的问题.