Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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 JSON对象中的二进制搜索_Javascript_Json - Fatal编程技术网

Javascript JSON对象中的二进制搜索

Javascript JSON对象中的二进制搜索,javascript,json,Javascript,Json,我有一个JSON对象,如下所示: "time1": { "item1": "val1", "item2": "val2" }, "time2": { "item1": "val3", "item2": "val4" } ... time*的值是以毫秒为单位的newdate()值,因此对time*值的顺序进行排序 现在我必须按时间搜索一个项目,如果键不存在,我必须取最近的值。 我在对象中有数千个条目,我正在考虑二进制搜索,但我不知道怎么做 我不能使用经典方法mid

我有一个JSON对象,如下所示:

"time1": {
    "item1": "val1",
    "item2": "val2"
},
"time2": {
    "item1": "val3",
    "item2": "val4"
}
...
time*
的值是以毫秒为单位的
newdate()
值,因此对
time*
值的顺序进行排序

现在我必须按时间搜索一个项目,如果键不存在,我必须取最近的值。 我在对象中有数千个条目,我正在考虑二进制搜索,但我不知道怎么做

我不能使用经典方法
middle=(right+left)/2
,因为中间值可能是
未定义的
。 我不能使用二叉树,因为我有一个我不能更改的已定义结构


谢谢

以下是您如何读取数组中的
时间
后缀:

var json = {
  "time1": {
    "item1": "val1",
    "item2": "val2"
  },
  "time2": {
    "item1": "val3",
    "item2": "val4"
  }
}
var values = [];
for (var i in json) {
  values += i.substring(4);
}

现在,您可以在
索引上进行二进制搜索。

以下是如何仅读取数组中的
时间
后缀:

var json = {
  "time1": {
    "item1": "val1",
    "item2": "val2"
  },
  "time2": {
    "item1": "val3",
    "item2": "val4"
  }
}
var values = [];
for (var i in json) {
  values += i.substring(4);
}

现在,您可以对
索引进行二进制搜索。

问题是,您可以对中位数进行未定义,但在最简单的形式下,您可以只使用中间键,
json.length/2
,它不是最优的,但可以工作。 接下来,您必须进行二进制搜索,但也要保留每个步骤的位置索引。 基本上,您要检查的是索引,并根据每个索引处的值决定是向右移动还是向左移动。 如果你遇到了死胡同,搜索的时间就不存在了,你知道“邻居”,最后一次检查,
If((time-to-u-search-json[index-1])>json[index+1]-time-to-u-search))
检查它离哪里更近,离
index-1
index+1
(这是
O(1)
,所以你很好)最后,您可以返回
json[index-1]
json[index+1]

这对你有意义吗

加了一把小提琴


注意:这不是一个完整的小提琴

问题是中位数可以是未定义的,但在最简单的形式下,您可以只使用中间键,
json.length/2
,它不是最优的,但可以工作。 接下来,您必须进行二进制搜索,但也要保留每个步骤的位置索引。 基本上,您要检查的是索引,并根据每个索引处的值决定是向右移动还是向左移动。 如果你遇到了死胡同,搜索的时间就不存在了,你知道“邻居”,最后一次检查,
If((time-to-u-search-json[index-1])>json[index+1]-time-to-u-search))
检查它离哪里更近,离
index-1
index+1
(这是
O(1)
,所以你很好)最后,您可以返回
json[index-1]
json[index+1]

这对你有意义吗

加了一把小提琴

注意:这不是一把完整的小提琴

var times = {
  "1367999303810": { // today at 9:48am
    "item1": "val1",
    "item2": "val2"
  },
  "1368000000000": { // today at 10am
    "item1": "val3",
    "item2": "val4"
  }
}
我会编写这样的代码(请修正数学!)

函数getNearest(findTime){
对于(var i=0;i=tArr[i])break;//精确定位
}
if(i==tArr.length)返回-1;//什么也没找到
if(i==tArr.length-1)返回tArr[i];//找到了终点
//在这里,查找时间大于一个数组项
var diff1=Math.abs(findTime-tArr[i]),//距离最后一个条目的距离
diff2=Math.abs(tArr[i+1]-findTime);//到下一个入口的距离
返回diff1==diff2?tArr[i+1]://返回最新时间
diff2>diff1?tArr[i]:tArr[i+1];//还是最近的
}    
var-tArr=[];
对于(以时间表示的var t)tArr.push(parseInt(t));
tArr.sort();
var findTime=新日期(2013,4,8,9,50,0).getTime();//今天9点50分
var时间=getNearest(findTime);
if(time!=-1)window.console&&console.log(times[时间])
假设

var times = {
  "1367999303810": { // today at 9:48am
    "item1": "val1",
    "item2": "val2"
  },
  "1368000000000": { // today at 10am
    "item1": "val3",
    "item2": "val4"
  }
}
我会编写这样的代码(请修正数学!)

函数getNearest(findTime){
对于(var i=0;i=tArr[i])break;//精确定位
}
if(i==tArr.length)返回-1;//什么也没找到
if(i==tArr.length-1)返回tArr[i];//找到了终点
//在这里,查找时间大于一个数组项
var diff1=Math.abs(findTime-tArr[i]),//距离最后一个条目的距离
diff2=Math.abs(tArr[i+1]-findTime);//到下一个入口的距离
返回diff1==diff2?tArr[i+1]://返回最新时间
diff2>diff1?tArr[i]:tArr[i+1];//还是最近的
}    
var-tArr=[];
对于(以时间表示的var t)tArr.push(parseInt(t));
tArr.sort();
var findTime=新日期(2013,4,8,9,50,0).getTime();//今天9点50分
var时间=getNearest(findTime);
if(time!=-1)window.console&&console.log(times[时间])

是否将值读入数组?(索引为
timevalue-firstTimeValue
)你能给出一个“时间值*”的实际例子吗?一个JSFiddle.net会很棒。请记住,对象中属性的顺序是,因此在进行有意义的二进制搜索之前,你必须将其转换为数组。从这里开始,它非常简单。
time*
值类似于1368000928818。例如,一些连续值是1368000928818、1368000938821、1368000948821和1368000958824。您可以看到,值之间没有共同的差异。“最近的值”或“匹配或下一个最低值”?后者稍微容易一些…将值读入数组?(索引为
timevalue-firstTimeValue
)你能给出一个“时间值*”的实际例子吗?一个JSFiddle.net会很棒。请记住,对象中属性的顺序是,因此在进行有意义的二进制搜索之前,你必须将其转换为数组。从这里开始,它非常简单。
time*
值类似于1368000928818。例如,一些连续值是1368000928818、1368000938821、1368000948821和1368000958824。您可以看到,值之间没有共同的差异。“最近的值”或“匹配或下一个最低值”?后者稍微容易一些……这是有道理的,但是json.length返回
未定义的
对,您必须使用