数组中具有一组值的循环迭代
Circular iteration with a set of values in array
要求使用数组中的一组值进行迭代。
$scope.weekArray=["Sun","Mon","Tue","Wed","Thurs","Fri","Sat"];
我有上一个持续时间值和当前日期。如果以前的持续时间值是5,我需要找出当前日期前5天的日期索引。例如:如果今天是星期一,我需要在星期一之前找到5天。答案是星期四(包括星期一)。请让我知道怎么做。
可以使用模块化%
运算符对Javascript中的数组进行循环迭代。
与array.length
和array.indexOf()
一起,您可以使用执行您想要的操作
$scope.weekArray=["Sun","Mon","Tue","Wed","Thurs","Fri","Sat"];
var currentDay = "Mon";
var indexOfCurrentDay = $scope.weekArray.indexOf(currentDay);
var whatYouWant = (indexOfCurrentDay-previous_duration);
//note that modulo does not work with negative numbers.
while (whatYouWant < 0)
whatYouWant += $scope.weekArray.length;
whatYouWant = whatYouWant % $scope.weekArray.length;
这是一个正在工作的jsFiddle:https://jsfiddle.net/hf4zqnwu/3/
我可以想出两种方法。这看起来可疑地像一个家庭作业,所以我不打算为你拼写出来,如果不是,请道歉:P
模块算术
JavaScript有一个模块化运算符(%),它对类似的东西很有用。
15 % 7 = 1
21 % 7 = 0
5 % 7 = 5
您可以使用它来"循环"到正确的值。请记住,回到7天和回到21天是一样的。
需要注意的重要一点是,如果你最终得到负数,模运算将不适用于你,所以为了避免问题,你可能想在你首先减去的数字上加7。
如果你做对了,你应该能够处理任何持续时间(即使返回的持续时间是12343434124123天)。如果做得不对,你可能会在任何超过7的时间内出现错误:)
使用计数器循环
使用for循环或while循环,倒计时需要返回的持续时间(如果您想返回5天,则从5到0)。从开始的一天开始,每次从你的指数中减去1。当索引超出数组中有效索引的范围时,循环返回到结束值。即,每次到达0时,返回到7。你最后得到的数字应该是你的目标指数。
我不会为你写代码,因为我觉得这是一项学校作业,但为什么不试试下面的x=今天之前的天数:
- 获取当天的索引
- 而x<7,x=x-7
- 如果前几天===0,则返回当前日期
- 如果当天的指数>x,则返回当天的天数-x
- 否则,当日指数的返回日+(7-x)
只需使用模运算:
(indexOf_currentday-天)%7=indexOf_searchedDay
在你的例子中,星期一有索引1(1-5)%7=-4%7=4%7=4
//almost same but without array manipulation
var weeksize = 7;
var getDayBeforeIncluding = $scope.getDayBeforeIncluding = function(current, delta){ //current -number of day, delta- days before
var realdelta = delta % weeksize;
var result = current - realdelta;
result = result > 0 ? result : (weeksize + result + 1); //+1 including
return result;
}
var myday = getDayBeforeIncluding (1,5); // 5 days before monday including == 4
console.log(""+myday+"== 4");
//and more smart version both for strings and numbers with argument checking and both including and not including
var weekArray = $scope.weekArray= "Sun","Mon","Tue","Wed","Thurs","Fri","Sat"];
var weeksize = weekArray.length; //no more magic strings
var getDayBefore = $scope.getDayBefore = function(current, delta, including){ //current -number of day, delta- days before
if(null==current){
throw "no day provided";
}
if(typeof(current)=='string'){
current = weekArray.indexOf(current);
}
if(typeof(current)!='number'){
throw "invalid day type";
}
if (current < 0 || current > weeksize) {
throw "invalid current value";
}
var includedelta = including ? 1: 0;
var realdelta = delta % weeksize;
var result = current - realdelta;
result = result > 0 ? result : (weeksize + result + includedelta ); //+1 including
return result;
}
- 是否“;对于的“;循环迭代遵循JavaScript中的数组顺序
- 从两个基于0的for循环迭代器中获取单个基于0的索引的公式
- JavaScript循环迭代太多
- 在不同数据选项之间循环迭代对象
- 比许多使用JavaScript的循环迭代更有效的解决方案
- While为List值在CSS选择器中循环迭代
- 如何在ajax完成后执行第二次循环迭代
- 通过循环迭代追加文本
- Javascript使用for-in循环迭代器来设置变量
- 循环/迭代要返回的对象数组和字符串数组 - Javascript
- Javascript:我的数组的大小随着每次for循环迭代而减小.为什么
- Knockout foreach 循环迭代相同的数据元素
- 所有属性都设置为上次循环迭代值 [为什么?
- 每次循环迭代强制转换为不同的类型
- 在“for”循环迭代之间添加延迟
- 如何在循环迭代的每三分之一上做一些事情
- Nodejs服务器-通过使循环迭代异步来提高性能
- 使用嵌套的“”循环迭代流星中的集合;forEach”;
- JavaScript循环迭代中的POST之间需要延迟
- 如何在点击函数javascript中显示当前循环迭代