Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.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/2/jquery/76.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 基于时间戳将元素插入DOM_Javascript_Jquery_Dom_Binary Search - Fatal编程技术网

Javascript 基于时间戳将元素插入DOM

Javascript 基于时间戳将元素插入DOM,javascript,jquery,dom,binary-search,Javascript,Jquery,Dom,Binary Search,我有一个JSON对象,其中包含一个“更新”数组,其中每个“更新”由一个时间戳和一条消息组成: updates : { { timestamp : 1329505671, text : 'test1' }, { timestamp : 1329505783, text : 'test2' } } 使用jQuery,我将这些元素解析为DOM元素,并按照接收顺序在同一级别插入它们。它们是根据AJAX调用中

我有一个JSON对象,其中包含一个“更新”数组,其中每个“更新”由一个时间戳和一条消息组成:

updates : {
    {
        timestamp : 1329505671,
        text : 'test1'
    },
    {
        timestamp : 1329505783,
        text : 'test2'
    }
}
使用jQuery,我将这些元素解析为DOM元素,并按照接收顺序在同一级别插入它们。它们是根据AJAX调用中我的SQL查询进行预排序的

现在,我有一个经常性的ajax调用来检查新的更新。如果找到更新,它需要将其插入DOM中的适当位置

我不能假设这些更新总是列表中最新的更新,因此,我需要一种方法来确定在哪个DOM更新之后插入新的更新

我曾计划创建一个
Map
(Javascript中的
updates[timestamp]=DOMUpdate

不过,该计划有几个缺陷:

  • 我必须找到/创建一个用于查找的快速二进制搜索算法 将更新放在哪个时间戳之后
  • 我不能有重复的时间戳

  • 所以我的问题是,是否有其他人做过类似的事情,如果是,你是如何做到的?如果我有任何不清楚的地方,请告诉我。

    只要找到第一个时间戳大于它的元素,并将其附加到该元素之前。如果没有找到,则它是最新的,应根据您发布它们的顺序(最新的第一个或最后一个)附加在开始/结束处

    var追加=false;
    $(集合)。每个(函数(){
    var timestamp=$(this).data(“timestamp”);//替换为代码
    if(时间戳<对象时间戳){
    $(this).before(buildNewElement(obj));
    附加=真;
    返回false;
    }
    });
    如果(!追加){
    $(collection).last()在(buildNewElement(obj))之后;
    }
    
    显然,这只是一个概念,您需要修改它以适应您的代码/需求

    编辑:


    如果将数据存储在对象数组中,然后在收到更多对象时将对象添加到该数组中,则可以在时间戳上对该数组进行排序,然后在排序后根据索引追加新对象。您必须向新接收的对象添加一个属性,然后在循环所有对象时删除该属性,并仅附加具有该属性的对象。

    是的,这是一个选项,ofc,但我希望它比线性搜索快一点。我想它应该足够快。线性搜索几乎是唯一的方法。您必须首先找到比它新的第一个元素,并将其追加到它之前。你也可以用一个过滤方法来完成,但我不期望它会更快,因为它仍然需要搜索它们。我更新了答案,以显示如何退出
    。each()
    我想线性更新实际上是可行的,因为尽管更新可能不是最新的,但它肯定会出现在更新的上半部分。所以它至少会和二进制搜索一样快。谢谢你的意见。
    var appended = false;
    $(collection).each(function(){
      var timestamp = $(this).data("timestamp"); // replace with your code
      if (timestamp < obj.timestamp) {
        $(this).before(buildNewElement(obj));
        appended = true;
        return false;
      }
    });
    if (!appended) {
      $(collection).last().after(buildNewElement(obj));
    }