2012-02-17 372 views
1

基礎位置I與「更新」,其中每個「更新」包括一個時間戳的陣列和消息JSON對象:插入元件成DOM,時間戳

updates : { 
    { 
     timestamp : 1329505671, 
     text : 'test1' 
    }, 
    { 
     timestamp : 1329505783, 
     text : 'test2' 
    } 
} 

使用jQuery,我解析將這些內容插入到DOM元素中,並按照接收的順序將它們插入到同一級別。他們根據我在AJAX調用中的SQL查詢預排序。

現在,我有一個經常性的AJAX調用,檢查是否有新的更新。如果找到更新,則需要將其插入DOM中適當的位置。

我不能假設,這些更新將始終在列表中的最新更新,所以,我需要一種方法來找出哪些DOM更新後插入新的更新。

我曾計劃創造各種各樣的Map<int, DOMUpdate>updates[timestamp] = DOMUpdate在Javascript)。

有幾個缺點這個計劃,雖然:

  1. 我不得不尋找/尋找 哪些時間戳後把更新創建一個快速的二進制搜索算法。
  2. 我不能有重複的時間戳。

所以我的問題是,如果其他人做了類似的事情,如果是的話,你是如何處理它?請讓我知道,如果我以任何方式不清楚。

回答

2

只要找到具有時間戳比它更大,並且元素之前將其追加的第一個元素。如果沒有找到,它是最新的,應在開始/結束取決於您發佈的順序(最新的第一個或最後一個)上追加。

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)); 
} 

顯然,這只是一個概念,你將需要對其進行修改,以適應您的代碼/需求。

編輯:

如果存儲在對象的數組數據,然後添加的對象爲更多的人接受該數組,你可以排序的時間戳數組,然後追加基礎上的新對象排序後的索引。您必須將屬性添加到新收到的對象,然後在循環遍歷所有對象並僅附加具有該屬性的對象時刪除該屬性。

+0

呀,這是一種選擇,OFC,但我想它是不是線性搜索速度更快一點。我想它應該足夠快。 – crush 2012-02-17 19:45:30

+0

線性搜索幾乎是唯一的方法。你必須首先找到比它更新的第一個元素,並將它追加到它之前。你也可以用過濾器方法來做到這一點,但我不希望它有更快的速度,因爲它仍然需要搜索它們。我更新了答案,以顯示如何退出'.each()' – 2012-02-17 19:47:22

+0

我想線性實際上是一條路,因爲雖然更新可能不是最新的,但它肯定會處於上半部分的更新。所以它至少與二分查找一樣快。感謝您的意見。 – crush 2012-02-17 19:59:49