如何修复无限循环?

时间:2018-09-16 00:43:37

标签: javascript

我开始学习JavaScript,作为一个小项目的一部分,我有一个Date对象数组,并且我尝试使用二进制搜索对其进行搜索。我不知道为什么,但是它变成了无限循环。 我知道问题出在第一个if(if mid

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

编辑

我将尝试更好地描述代码... 二进制搜索的功能会接收到一个日期对象数组(db =数据库),以及该搜索应找到的另一个日期对象(objDate)。 我想让搜索功能返回是否被搜索的对象在数组中(这是对与错),以及它的索引是什么(或者如果它不在数组中,它应该在其中的索引)?这就是为什么我也中途返回。 我知道返回两个值不是最好的事情,但是我需要两个值,因此在调用函数时将它们放在两个变量中。 我在这里添加了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)

2 个答案:

答案 0 :(得分:0)

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

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)

答案 1 :(得分:0)

您可以使用数组的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;
}