每天从数组中挑选新项目

pick new item from array every day

本文关键字:挑选 新项目 数组 每天      更新时间:2023-09-26

假设我有一个任意固定长度的数组,即它可以是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);