我开始学习JavaScript,作为一个小项目的一部分,我有一个Date对象数组,并且我尝试使用二进制搜索对其进行搜索。我不知道为什么,但是它变成了无限循环。
我知道问题出在第一个if(if mid ** timeDiff是一个函数,该函数返回两个日期中的哪个更大(以后) 编辑 我将尝试更好地描述代码...
二进制搜索的功能会接收到一个日期对象数组(db =数据库),以及该搜索应找到的另一个日期对象(objDate)。
我想让搜索功能返回是否被搜索的对象在数组中(这是对与错),以及它的索引是什么(或者如果它不在数组中,它应该在其中的索引)?这就是为什么我也中途返回。
我知道返回两个值不是最好的事情,但是我需要两个值,因此在调用函数时将它们放在两个变量中。
我在这里添加了timeDiff函数(该函数接收两个Date对象,并返回其中的一个更大(以后)),并提供一个运行示例。 一个应该返回“ true,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 ;
}
}
(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)
答案 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;
}