繁体   English   中英

如何修复无限循环?

[英]How to fix an infinite loop?

我开始学习 JavaScript,作为一个小项目的一部分,我有一个 Date 对象数组,我正在尝试使用二进制搜索在其中进行搜索。 我不知道为什么,但它变成了一个无限循环。 我知道问题出在第一个 if (if mid < right),因为它在 if 的内容独立时起作用。 但是如果我只放内容,当 mid = right 时,函数会卡住。 我看不到 if 中的什么使它成为无限循环或如何修复它。 如果您能提供帮助,我将不胜感激。

**timeDiff 是一个函数,它返回两个日期中哪个更大(稍后)

编辑

我将尝试更好地描述代码......二分搜索的函数接收一组日期对象(db = 数据库),以及一个搜索应该找到的日期对象(objDate)。 如果搜索到的对象在数组中(这是 true 和 false),我希望搜索函数返回,以及它的索引是什么(或者它应该在的索引,如果它不在数组上) - 这个这就是为什么我也返回中场的原因。 我知道返回两个值不是最好的,但我需要它们两个,所以我在调用函数时把它们放在两个变量中。 我在这里添加了函数 timeDiff(它接收两个 Date 对象并返回它们中的哪个更大(稍后))和一个运行示例。

function timeDiff(objDate, currDate) {

  var _MS_PER_DAY = 86400000

  var day1 = Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate(), objDate.getHours(), objDate.getMinutes());
  var day2 = Date.UTC(currDate.getFullYear(), currDate.getMonth(), currDate.getDate(), currDate.getHours(), currDate.getMinutes());

  return (day1 - day2) / _MS_PER_DAY ;

function binarySearch(db, objDate){

  var left = 0, right = db.length ;

  while (left <= right){

    var mid = Math.trunc((left + right) / 2) ;
    if (mid != right) { 
    var currDate = new Date(db[mid].date) ; 
    }

    if (timeDiff(objDate, currDate) === 0){
      return true, mid ;
    }
    if (timeDiff(objDate, currDate) < 0){
      right = mid - 1  ;
    }
    if (timeDiff(objDate, currDate) > 0){
      left = mid + 1 ; 
    }
  }

  (timeDiff(objDate, currDate) > 0) ? mid-- : mid = mid ;

  return false, mid ;
}

一个应该返回“true, 0”(但实际上没有完成运行)的运行示例是:

var a = [{ "date": "2018-09-12", "appointments": [ { "subject": "Code review", "start": "09:00", "duration": 1.5 }, { "subject": "JavaScript objects", "start": "10:45", "duration": 2 } ] }] ;
var b = new Date(2018, 09, 12, 8, 0)
binarySearch(a, b)

它确实结束了,它只循环了两次。

 function timeDiff(objDate, currDate) { var _MS_PER_DAY = 86400000 var day1 = Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate(), objDate.getHours(), objDate.getMinutes()); var day2 = Date.UTC(currDate.getFullYear(), currDate.getMonth(), currDate.getDate(), currDate.getHours(), currDate.getMinutes()); return (day1 - day2) / _MS_PER_DAY ; } function binarySearch(db, objDate){ var left = 0, right = db.length ; while (left <= right){ var mid = Math.trunc((left + right) / 2) ; if (mid != right) { var currDate = new Date(db[mid].date) ; } if (timeDiff(objDate, currDate) === 0){ return true, mid ; } if (timeDiff(objDate, currDate) < 0){ right = mid - 1 ; } if (timeDiff(objDate, currDate) > 0){ left = mid + 1 ; } console.log('looping'); } (timeDiff(objDate, currDate) > 0) ? mid-- : mid = mid ; return false, mid ; } var a = [{ "date": "2018-09-12", "appointments": [ { "subject": "Code review", "start": "09:00", "duration": 1.5 }, { "subject": "JavaScript objects", "start": "10:45", "duration": 2 } ] }] ; var b = new Date(2018, 09, 12, 8, 0) binarySearch(a, b)

您可以使用数组的 find 方法

 var a = [{ "date": "2018-09-12", "appointments": [ { "subject": "Code review", "start": "09:00", "duration": 1.5 }, { "subject": "JavaScript objects", "start": "10:45", "duration": 2 } ] }] ; var b = new Date(2018, 09, 12, 8, 0) console.log(a.find(item => item.date === `${b.getFullYear()}-${pad(b.getMonth())}-${pad(b.getDate())}`)); function pad(num) { return num < 10 ? '0' + num : num; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM