我试图想办法用纯JS从一个数组中拉出一个随机字符串,而没有相同的字符串连续出现两次。
我使用随机数(random number
)使用随机数索引从randomMsg
中提取随机字符串,然后将其存储在{\ n}中{1}}。
点击后,我会用新的随机字符串重新定义currentMsg
。我之后使用currentMsg
/ if
语句来查看我们的else
是否等于prevMsg
,如果是的话(它不是'{1}}首先点击),我使用另一个currentMsg
/ if
语句来递增或递减索引,因此它会向我们的HTML返回一个唯一的字符串(else
)并设置{{ 1}} var到那个字符串。
否则,它会将anotherMsg
返回给我们的HTML,并将prevMsg
设置为currentMsg
。
下面的功能:
prevMsg
我还设置了JSFiddle here。
虽然它有效,但我现在急于想要编写这样一个功能更优雅的方法。我还要更换整个字符串,更换一个字(一个,两个,三个等)或者不重要一点是不是更好?
感谢任何帮助。提前谢谢!
答案 0 :(得分:2)
对于可读性和通用的原因,数组应该在 功能 >:
/
返回随机数但不 当前 随机数的函数:
var msg = [
"string one",
"string two",
"string three",
"string for",
"string five",
"string six" /* add as many values as you want */
];
Arr必须是函数的参数,因为需要数组的长度。还有一个返回随机数的函数:
function randWithout(n, arr) {
var res = [];
for (var i = 0; i < arr.length; i += 1) {
if (i !== n) {
res.push(i);
}
}
return res[Math.floor(Math.random() * (arr.length - 1))];
}
最后一项功能:
function randNumber(arr) {
var rand = Math.floor(Math.random() * arr.length);
return rand;
}
简单和可读!
答案 1 :(得分:1)
不是从数组中随机拉出一个字符串,而是将数组洗牌并按顺序拉出字符串。
randomMsg.sort(function(){return Math.random()-0.5}); // shuffle
如果您想将randomMsg
的原始订单只保留.slice()
到另一个数组中:
var shuffedMsg = randomMsg.slice().sort(function(){return Math.random()-0.5});
就像洗牌一副纸牌一样,你可以不止一次地洗牌再混合一下。但是像上面的例子那样调用.sort()
会变得单调乏味。所以将它包装在一个函数中:
function shuffle (arr) {
return arr..sort(function(){return Math.random()-0.5});
}
var shuffledMsg = shuffle(shuffle(shuffle(randomMsg.slice())));
答案 2 :(得分:0)
我取消了另一个Msg,一个if子句,并使用了三元运算符:
(function message() {
var currentMsg, prevMsg;
var ranNumber = Math.floor((Math.random() * 5) + 0);
var randomMsg = [
"string one",
"string two",
"string three",
"string four",
"string five"
];
prevMsg = (prevMsg) ? prevMsg : "";
var currentMsg = randomMsg[ranNumber];
document.getElementById("intro").innerHTML = currentMsg;
document.getElementById("intro").onclick = function() {
var ranNum = Math.floor((Math.random() * 5) + 0);
currentMsg = randomMsg[ranNum];
if(prevMsg === currentMsg) {
ranNum = (ranNum === 4) ? 0 : ranNum++;
currentMsg = randomMsg[ranNumber];
}
document.getElementById("intro").innerHTML = currentMsg;
prevMsg = currentMsg;
};
})();
答案 3 :(得分:0)
在点击移动消息tmpMsg上添加了另一个tmpMsg,在下一次迭代时合并回randomMsg并将最新显示的消息移动到tmpMsg。
def date_of_next_X_day_Y_days_out_from_Z_start(day=ENV['day_to_start_plans'], number_of_days=ENV['min_days_out'], start_date)
real_start_date = start_date + number_of_days
until real_start_date.wday == Date.parse(day).wday
real_start_date += 1
end
real_start_date
end
答案 4 :(得分:0)
以下代码非常简单,但可能会继续迭代很多,特别是如果消息数量很少的话。如果没有至少两条消息,则会出现无限循环。
getActivity()
var messages = ["string one", "string two", "string three", "string four", "string five"];
var i = -1,
intro = document.getElementById("intro");
(intro.onclick = function() {
while( i == (i = Math.floor((Math.random() * messages.length))) );
intro.textContent = messages[i];
})();
为了避免这些问题,请更好地使用以下内容,即使它不那么简单:
<h1 id="intro"></h1>
var messages = ["string one", "string two", "string three", "string four", "string five"];
var i = Math.floor((Math.random() * messages.length)),
intro = document.getElementById("intro");
(intro.onclick = function() {
intro.textContent = messages[i];
var rand = Math.floor((Math.random() * (messages.length-1)));
i = rand + (rand >= i);
})();
答案 5 :(得分:0)
我更喜欢更具可读性的方法。
(function message() {
var introElem = document.getElementById("intro");
var randomMessages = [
"string one",
"string two",
"string three",
"string four",
"string five"
];
var randomMessagesLength = randomMessages.length;
introElem.innerHTML = getRandomMessage(introElem);
introElem.onclick = function() {
introElem.innerHTML = getRandomMessage(introElem);
};
function getRandomMessage(elem) {
var isNewRandMessage = false;
var randMessage = "";
do {
randNumber = Math.floor(Math.random() * randomMessagesLength);
randMessage = randomMessages[randNumber];
if (elem.innerHTML != randMessage) {
isNewRandMessage = true;
}
} while (!isNewRandMessage);
return randMessage;
}
})();