如何获取数组中的下一个条目而不是当前条目?

时间:2015-09-07 20:25:55

标签: javascript

我有一段代码可以执行此操作:

如果它在0000到0600之间,它将显示“夜晚”。如果它在0600和1200之间,它将显示“早晨”。如果它在1200到1800之间,它显示“下午”,并在1800到2400“晚上”。

然而,我想要它做的是显示数组中的 next 条目,而不是当前条目。所以,在0600到1200之间它应该显示“下午”而不是“早晨”。

这是我的代码:

function startTime() {

  var today = new Date();
  var h = today.getHours();
  var m = today.getMinutes();
  var wv = today.getDay();

  var hv = 100 * h + m;

  var wv1 = new Array();
  wv1[0] = '0000,0600,Night';
  wv1[1] = '0600,1200,Morning';
  wv1[2] = '1200,1800,Afternoon';
  wv1[3] = '1800,2400,Evening';
  
  if (wv == 1) {
    wv1.forEach(function(entry) {
      var schedule = entry.split(',');
      if (hv >= schedule[0] && hv <= schedule[1]) {

        var timeofday = schedule[2];

        //Schedule
        document.getElementById('day').innerHTML = timeofday;

      }
    });
  }
}
<body onload="startTime()">
  <div id="main-wrapper">
    <div id="day"></div>
  </div>
</body>

6 个答案:

答案 0 :(得分:3)

我的做法略有不同:

startTime();

function startTime(){
    var hours = new Date().getHours();
    var i = Math.floor(hours/6);
    var timeofday = ['Morning','Afternoon','Evening','Night'][i];
    document.getElementById('day').innerHTML = timeofday;
}
<div id="day"></div>

每小时演示

function startTime(hours){
    var i = Math.floor(hours/6);
    var timeofday = ['Morning','Afternoon','Evening','Night'][i];
    return timeofday;
}

for(var h=0; h<24; h++){
    document.body.innerHTML += h +'h => '+ startTime(h) +'<br>';
}

答案 1 :(得分:1)

我不确定为什么你的代码不必要地复杂化。为什么不使用类似的东西:

var today = new Date(); 
var message;
if(today.getHours() <= 6) message = "Morning"
// etc

答案 2 :(得分:0)

只需添加一项检查,看看下一个索引是否超过了长度。如果是,则使用0.否则使用下一个索引。

function startTime() {

  var today = new Date();
  var h = today.getHours();
  var m = today.getMinutes();
  var wv = today.getDay();

  var hv = 100 * h + m;

  var wv1 = new Array();
  wv1[0] = '0000,0600,Night';
  wv1[1] = '0600,1200,Morning';
  wv1[2] = '1200,1800,Afternoon';
  wv1[3] = '1800,2400,Evening';
  
  if (wv == 1) {
    wv1.forEach(function(entry, index) {
      var schedule = entry.split(',');
      if (hv >= schedule[0] && hv <= schedule[1]) {
        var nextTime = wv1[index >= wv1.length - 1 ? 0 : ++index];
        var timeofday = nextTime.split(',')[2];

        //Schedule
        document.getElementById('day').innerHTML = timeofday;

      }
    });
  }
}
<body onload="startTime()">
  <div id="main-wrapper">
    <div id="day"></div>
  </div>
</body>

答案 3 :(得分:0)

在当前设置中获取下一个块的最简单方法是简单地将600添加到当前时间:

 var hv = (600 + 100 * h + m) % 2400;

当然对于其他设置/对象,其他解决方案也是可行的,但是仍然可以通过这种方式完成下一个块,而无需额外调用“下一个”索引

答案 4 :(得分:0)

至于CodeOcelot的观点,你接近的方式比必要的更复杂,但我会回答这个问题,假设你需要遵循这个特定的模型。

解决方案:我会添加array参数,以便与index一起访问当前数组,以访问下一个项目。

  if (wv == 1) {
    wv1.forEach(function(entry, index, array) {
      var schedule = entry.split(',');
      var nextItem = array[index++].split(',');

      if (hv >= schedule[0] && hv <= schedule[1]) {
        var nextTime = wv1[index >= wv1.length ? 0 : ++index];
        var timeofday = nextItem[2];

        //Schedule
        document.getElementById('day').innerHTML = timeofday;
      }
    });
  }
}

希望这有帮助!

答案 5 :(得分:0)

你在百年之前就像某人一样编写代码(开玩笑)。请聪明而简短。 (顺便说一句:我喜欢CodeOcelot的简单if语句)。

另一种更具说明性的方法可以是这种方法(并且没有使每个代码更复杂的if语句)。这可以完成,因为名称对于时钟数是多余的。

var names = ["Night","Morning","Afternoon","Evening"]
var index = Math.floor(new Date().getHours() * names.length / 24)
document.getElementById('day').innerHTML = names[index];