我们说我有一个任何固定长度的数组,即它可能是3,5,7 ......最多30个。
如何生成算法,如果我每天从数组中选择一个项目,它不应该连续两天选择相同的项目索引。
注意:我没有能力存储,前一天选择的内容。
例如, 如果我的数组是[" a"," b"," c"," d"," e", " F"]
有效的结果将是
["a", "b", "c", "d", "e", "f", "d", "a", "c", "d", "e", "f", "a", "b", "c", "d", "e", "f", "a", "b", "c", "d", "e", "f", "a", "b", "c", "d", "e", "f"]
无效的结果将是
["a", "b", "c", "d", "e", "f", "a", "b", "b", "d", "e", "f", "a", "b", "c", "d", "e", "f", "a", "b", "c", "d", "e", "f", "a", "b", "c", "d", "e", "f"]
请注意上面的连续b
理想的结果是:在达到长度结束后整个阵列完全旋转。
["a", "b", "c", "d", "e", "f", "a", "b", "c", "d", "e", "f", "a", "b", "c", "d", "e", "f", "a", "b", "c", "d", "e", "f", "a", "b", "c", "d", "e", "f"]
答案 0 :(得分:1)
var d = new Date();
var n = d.getDay();
var chr = String.fromCharCode(97 + n);
每天运行此操作以生成序列中的下一个值。
所以你的序列将是:
a,b,c,d,e,f,g
答案 1 :(得分:1)
尝试使用mod(%),数字永远不会超过数组长度。演示:
var array = ["a", "b", "c", "d", "e", "f"];
var output = [];
for (var day = 1; day < 365; day++) {
output.push(array[day % array.length])
}
console.log(output);
答案 2 :(得分:1)
这很容易使用getDate
来完成,它返回当月的当天(1 - 31,具体取决于月份)。将此与模数运算符相结合可确保您始终以非连续顺序获得有效项目。
function log(msg) {
document.querySelector('pre').innerHTML += msg + '\n';
}
function logItem(items, date) {
var index = (date.getDate() - 1) % items.length;
var item = items[index];
log(date.toDateString() + ' : ' + item);
}
function addDay(date) {
date.setDate(date.getDate() + 1);
}
var items = ['a', 'b', 'c', 'd', 'e', 'f'];
var day = new Date(2016, 0, 1);
for (var i = 0; i < items.length * 3; i++) {
logItem(items, day);
addDay(day);
}
<pre></pre>
这个确切的实现存在一个问题:月末可能具有与该月的第一个相同的相对值。
function log(msg) {
document.querySelector('pre').innerHTML += msg + '\n';
}
function logItem(items, date) {
var index = (date.getDate() - 1) % items.length;
var item = items[index];
log(date.toDateString() + ' : ' + item);
}
function addDay(date) {
date.setDate(date.getDate() + 1);
}
var items = ['a', 'b', 'c', 'd', 'e', 'f'];
var day = new Date(2016, 0, 30);
for (var i = 0; i < 4; i++) {
logItem(items, day);
addDay(day);
}
<pre></pre>
要处理此问题,您可以determine how many days are in the month,确定您的开始和结束索引是否相同,如果是,则更改一个。您如何选择替代值取决于您。
function log(msg) {
document.querySelector('pre').innerHTML += msg + '\n';
}
function logItem(items, date) {
// ---
var daysInMonth = getDays(date);
var day = date.getDate();
var index = (day - 1) % items.length;
if (day === daysInMonth && (day - 1) % items.length === 0) {
// Change to a different item
index = Math.floor(Math.random() * (items.length - 3)) + 2;
}
// ---
var item = items[index];
log(date.toDateString() + ' : ' + item);
}
function getDays(date) {
return new Date(date.getYear(), date.getMonth() + 1, 0).getDate();
}
function addDay(date) {
date.setDate(date.getDate() + 1);
}
var items = ['a', 'b', 'c', 'd', 'e', 'f'];
var day = new Date(2016, 0, 30);
for (var i = 0; i < 4; i++) {
logItem(items, day);
addDay(day);
}
<pre></pre>
答案 3 :(得分:1)
我使用模运算符%
制作了一个解决方案。不确定这是否正是您想要的,但它似乎正常工作。
var items = ["a","b","c","d","e","f"];
var day = new Date().getDay();
console.log(items[day % items.length]);
你可以把它放到一个函数中,或者显示它你想要的。
答案 4 :(得分:0)
尝试这样的事情
var a = ["a", "b", "c", "d", "e", "f"],
b = [],
random;
var i = function(val) {
random = val[Math.floor(Math.random() * val.length)];
(random != b[b.length - 1]) ? b.push(random): b.push('duplicate');
console.log(b);
}
setInterval(() => {
i(a)
}, 1000);
&#13;