每天从数组中挑选新项目
pick new item from array every day
假设我有一个任意固定长度的数组,即它可以是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"]
尝试使用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);
var d = new Date();
var n = d.getDay();
var chr = String.fromCharCode(97 + n);
每天运行此操作以生成序列中的下一个值。
所以你的顺序是:
a、 b、c、d、e、f、g
我使用模运算符%
给出了一个解决方案。不确定这是否正是你想要的,但它似乎工作正常。
var items = ["a","b","c","d","e","f"];
var day = new Date().getDay();
console.log(items[day % items.length]);
您可以将其放入一个函数中,或者按照自己的意愿进行显示。
使用返回当月当前日期(1-31取决于月份)的getDate
很容易实现这一点。将其与模数运算符相结合可确保始终以非连续顺序获得有效项。
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>
要处理此问题,您可以确定一个月中有多少天,确定开始和结束指数是否相同,如果相同,则更改一个。如何选择替代价值取决于您。
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>
试试这样的
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);
- 动态地改变“”的URL;添加新项目”;链接使用javascript/jquery
- Redux处理新项目和id
- JQuery Masonry.Ajax图标和“;加载新项目”;绳子放错地方了
- Ng-Repeat在末尾添加新项目
- AngularJs/GitHub :如何在没有任何历史记录的情况下将角度种子克隆到我的新项目中
- 每天从数组中挑选新项目
- 将jquery插件应用于angularJS ng repeat中的新项目
- 使用新项目更新KendoUI网格数据源
- AngularJS ForEach将新项目推送到对象中
- 在 SharePoint 2010 上创建“添加新项目”按钮
- id:在续集中创建新项目时为空
- 新项目的所有列表项弹出窗口在悬停时立即显示 - Javascript
- AngularJS:插入新项目后对列表重新排序
- 扩展菜单插入带有覆盖的新项目
- 如何将新项目添加到 srt 文件中
- 如何在 JQGRID 新项目弹出窗口中应用 OnKeyUp 方法
- 在SlickGrid的dataView的第一行添加一个新项目,就像JavaScript的unshift一样
- 当一个新项目被添加到FireBug控制台时,是否有一个jQuery事件等同于
- jquery:单击新项目时重置css
- 如何在将新项目POST到服务器后更新ng重复