特别是当我们必须在两个日期之间选择数据时,以下哪个JSON更好

which of the following JSON is better to work with specially when we have to select data between 2 dates?

本文关键字:数据 选择 更好 JSON 之间 两个 我们 特别是 日期      更新时间:2023-09-26

以下哪种JSON格式会更好。根据我的说法,第二个会更好,因为我可以直接找到特定日期的数据,只需通过数组索引。我更喜欢哪一个

首先

 [{
  "date" : "20100808", //2010-08-08
  "data" : "one"
 },
 {
  "date" : "20100809",
  "data" : "Two"
 }]

第二

 [{
  "20100808" : "one"
 },
 {
  "20100809" : "Two"
 }]

当你想要select data between two dates时,第一个更好。你可以这样写

data = [{
  "date" : "20100808", //2010-08-08
  "data" : "one"
 },
 {
  "date" : "20100809",
  "data" : "Two"
}];
dataBetwnTwoDates = data.filter(function(d) {
  var date = new Date(d.date);               // insert your function to convert "20100808" into Date object and store in date.
  return +date > +date1 && +date < date2;    // +date will convert Date object to integer; date1 and date2 are Date objects in between whom you want the data to be.
});

根据标题的要求,您希望搜索范围内的数据,您的第一个建议似乎很有希望。为了确保,我希望函数签名类似于

collect_data(json_arr, begin_date, end_date) {}

,其中函数返回JSON片段中描述的"data"元素数组。

范围查询

假设数组的元素按日期排序,您可以在begin_date上进行二进制搜索以找到应该落入范围的第一个元素,然后继续迭代数组,直到数组或end_date的结束。

注意两点:

  1. 确切的begin_dateend_date可能不包含在JSON中(但二进制搜索仍然有效)。
  2. JSON中可能不包含您正在查询的范围。

最坏的情况下运行时间是O(n),这是你能做到的最好的情况,因为在最坏的情况下你必须从每个元素收集数据。

<<p> 点查询/strong>

对于点查询,您也可以使用上述方法,这将在O(log(n))中运行,或者如果您有空间创建一个索引结构,将时间戳映射到数组中的正确索引。例如:

{
    "20100809": 0, //element to be found in json_arr[0]
    "20100810": 1,
}

运行时间为0(1)。