Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中obj数组的高效搜索_Javascript_Algorithm_Binary Search - Fatal编程技术网

Javascript中obj数组的高效搜索

Javascript中obj数组的高效搜索,javascript,algorithm,binary-search,Javascript,Algorithm,Binary Search,假设我有一个对象的预排序数组,比如: let data = [ { moment: '00:01', otherProp: 'something', somethingMore: 'someelse'}, { moment: '01:10', otherProp: 'something', somethingMore: 'someelse'}, { moment: '05:37', otherProp: 'something', somethingMore: 'somee

假设我有一个对象的预排序数组,比如:

let data = [
    { moment: '00:01', otherProp: 'something', somethingMore: 'someelse'},
    { moment: '01:10', otherProp: 'something', somethingMore: 'someelse'},
    { moment: '05:37', otherProp: 'something', somethingMore: 'someelse'},
    { moment: '07:51', otherProp: 'something', somethingMore: 'someelse'},
    //and so on
]
输入x的格式为hour:minutes字符串ex.x='06:05',我需要找到两个连续的对象data[I]和data[I+1],这样data[I].moment 我必须从头开始实现二进制搜索吗

重点是什么?这只是几行代码:

让数据=[ {瞬间:'00:01',其他道具:'something',somethingMore:'something'}, {瞬间:'01:10',其他道具:'something',somethingMore:'something'}, {瞬间:'05:37',其他道具:'something',somethingMore:'something'}, {瞬间:'07:51',其他道具:'something',somethingMore:'something'}, //等等 ]; 让搜索='06:05'; 设lo=-1,hi=data.length-1,mid; whilehi>lo{ ifdata[mid=lo+hi+1>>1]。力矩>搜索{ hi=mid-1; }否则{ lo=中; } } 控制台。日志数据[lo]; console.logsearch; 控制台.日志数据[lo+1]; .作为控制台包装{top:0;最大高度:100%!重要}
这会起作用。

如果搜索小于第一个值、大于最后一个值或等于数组的某个值,该怎么办?@RobertBaron这很好,因为我只想知道理论上如何做,我可以自己管理这些边缘情况。托马斯这也是我的第一个想法,我只是想确定没有更好或者更干净的解决方案,谢谢你的帮助@罗伯特巴隆如果你已经检查并看到所有这些案例都已经涵盖了怎么办?
var pos = data.indexOf(data.find(function(obj) { 
    var value = (obj.moment.split(":")[0]*60) + (obj.moment.split(":")[1]*1)
    var key =(search.split(":")[0]*60) + (search.split(":")[1]*1);
    return (key < value);
   }));

pos = pos >= 0 ? pos : data.length

data.splice(pos, 0, {moment:search, otherProp:"something", somethingMore: "someelse"});