每天从数组中选择新项

时间:2016-04-18 19:12:41

标签: javascript arrays algorithm

我们说我有一个任何固定长度的数组,即它可能是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"]

5 个答案:

答案 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)

尝试这样的事情

&#13;
&#13;
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;
&#13;
&#13;