2011-01-12 52 views
1

我正在使用AJAX自動更新信息表,但我碰到了路上的凹凸。我使用PHP來對每個請求,其中包含下列格式的數據返回一個JSON對象:在JavaScript中比較可變大小的對象

({ 
    "table": { 
     "544532": { 
      "field1": "data", 
      "field2": "data2", 
      "field3": "data3", 
      ..... 
     }, 
     "544525": { 
      "field1": "data", 
      "field2": "data2", 
      "field3": "data3", 
      ..... 
     }, 
     ...... 
    } 
}); // 

我用的Prototype.js獲得ID列表到一個數組:

var ids = Object.keys(data.table).sort(); 

但是,隨機表中的行可以隨時從列表中消失,並且可以隨時將新行添加到結尾。我假設我會存儲前一個請求中的ID數組,並將它們與新數組進行比較,但由於隨機行可以消失,因此在這之後移動ID,如何比較這些ID以便我只能添加新行或從頁面中刪除已刪除的行?

+0

+1有趣的挑戰! – clockworkgeek 2011-01-12 17:44:13

回答

2

不幸的是Prototype不包含一個Set類型,它可以使事情變得簡單很多。因此,我們將不得不做出與此有關:

Array.prototype.subtract = function(a){ 
    return this.reject(this.include.bind(a)); 
} 

上面增加了一個急需subtract功能。我們可以用這樣的:

added_ids = new_ids.subtract(old_ids); 
removed_ids = old_ids.subtract(new_ids); 

這不是太慢要麼因爲有些瀏覽器支持indexOf其原型的include檢查和使用。

PS。陣列已經有一個intersect功能,如果你想要一個complement太這裏是...

Array.prototype.complement = function(a){ 
    return a.reject(this.include.bind(this)); 
} 

本質a.subtract(b)相同b.complement(a)

+0

謝謝!我一整天都在苦苦掙扎,這完美無瑕! – 2011-01-12 18:28:30

0

我確定有更好的方法來做到這一點 - 但您需要將表中顯示的行存儲在某處 - 可能是一個數組 - 然後循環JSON對象,將這些行與數組進行比較。

+0

雖然你通過什麼循環?你是通過新的行列還是舊行列?兩者的長度可能相同,但具有不同的ID,這對於此將是理想的,但如果它們的長度不同,會怎樣? – 2011-01-12 18:06:04

0

當表更新時,您應該更新您的JSON數據結構。那將是該頁面的數據模型。然後,您可以每次需要時致電Object.keys(data.table)