如何向后循环遍历字符串数组x次,并在到达终点时重新开始?

时间:2019-09-02 21:04:37

标签: javascript reactjs

我正试图向后循环11个月。基本上,我有一个当前月(2019年9月),我想回溯11个月,直到2018年10月结束。我查看了太多代码片段,但没有一个片段涵盖了整个“重新开始”部分。重点是将这几个月推入下拉菜单。因此具有当前月份和前11个月。

我已经尝试过此代码段。它只是前进。当我将其设置为向后退时,就会出现无休止的循环,这会终止我的Chrome。

这是我到目前为止所拥有的:

var monthNames = ["January", "February", "March", "April", "May", "June",
  "July", "August", "September", "October", "November", "December"
];
var d = new Date();
console.log(d.getMonth() + " is the index");

var index = monthNames[d.getMonth()];
console.log(index + ' is the month');
let monthIndex = monthNames.indexOf(index);
var n = 11

var result = [];

for (var i = monthIndex, len = monthNames.length; i <= monthIndex + n; i++) {
    result.push(monthNames[(i + len) % len]);
}


console.log(result.join(", "));

如果我希望它从9月开始,然后向后延伸到10月,它会在几个月后向前发展。

感谢您的帮助。谢谢!

5 个答案:

答案 0 :(得分:0)

您可以将实际月份作为偏移量,然后减去索引,然后将其余部分与其余部分一起获得月份名称的值。

var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
    offset = new Date().getMonth(),
    length = 12,
    result = Array.from({ length }, (_, i) => monthNames[(12 + offset - i) % 12]);

console.log(result.join(", "));

答案 1 :(得分:0)

如果您想要类似Python的逻辑,可以尝试JavaScript Proxies

const monthNames = [
  "January",
  "February",
  "March",
  "April",
  "May",
  "June",
  "July",
  "August",
  "September",
  "October",
  "November",
  "December"
];

const months = new Proxy(monthNames, {
  get(target, prop) {
    if (!isNaN(prop)) {
      prop = parseInt(prop, 10);
      if (prop < 0) {
        prop += target.length;
      }
    }
    return target[prop];
  }
})


let d = new Date()
let start = d.getMonth() - 1
let n = 11
let end = start - n,
    result = []


for(let c = start; c >= end; c--){
  result.push(months[c])
}

console.log(result.join(", "))

这样,您只需要起始月份并从中减去11,就可以轻松地从months调用该范围。 (例如,开始5,结束5-11)

答案 2 :(得分:0)

一种有效的方法是每次从索引中减去一个,检查您何时在0处循环返回到末尾,并在到达起点多一个时停止循环。请注意,这将使循环提前结束,因为开始时您的结束条件是正确的-因此,您需要从当前位置开始预填充数组。

我还删除了原始代码中的许多不必要的重复。我自由地承认,下面的内容并不是特别优雅,但是它可以正常工作并且应该易于理解。

var monthNames = ["January", "February", "March", "April", "May", "June",
  "July", "August", "September", "October", "November", "December"
];
var startMonth = new Date().getMonth();

var result = [monthNames[startMonth]];

if (startMonth == 0) {
    startMonth = monthNames.length;
}

for (var i = startMonth - 1; i != startMonth; i = (i == 0) ? monthNames.length : (i - 1)) {
    result.push(monthNames[i]);
}


console.log(result.join(", "));

答案 3 :(得分:0)

保持简单:

const monthNames = ["January", "February", "March", "April", "May", "June",
  "July", "August", "September", "October", "November", "December"
];


const octoberIndex = monthNames.findIndex(month => month === "October");
const monthsFromOctoberToSeptember = monthNames.slice(octoberIndex, monthNames.length)
.concat(monthNames.slice(0, octoberIndex));

const result = monthsFromOctoberToSeptember.reverse();

console.log(result.join(', '));
  

9月,8月,7月,6月,5月,4月,3月,2月,1月,   十二月,十一月,十月

答案 4 :(得分:0)

与上面的建议相差无几,但易于理解

var monthNames = ["January", "February", "March", "April", "May", "June",
  "July", "August", "September", "October", "November", "December"
];
var currentDate = new Date();
var currentMonthIndex = currentDate.getMonth();
var result = [];
var monthLength = 12;

for (var i = currentMonthIndex; i < monthLength; i--) {
  result.push(monthNames[i]);

  if (result.length === monthLength) {
    break;
  }

  if (i === 0) {
    i = monthLength;
  }  
}


console.log(result.join(", "));