2012-04-17 146 views
0

我想建立一個web應用從服務器獲取數據,並將其顯示給用戶。腳本每10秒從服務器獲取數據,如果數據發生更改,它會提醒用戶。這是我現在使用的代碼,但它每隔10秒就會發出一次數據是否已更改的警告。的Javascript JSON比較

那麼,如何做,我需要改變我的素文字,使它比較舊的JSON和新的JSON,看看它們是不同的,如果他們是顯示警報更新顯示給用戶數據之前?

$('#ListPage').bind('pageinit', function(event) { 
    getList1(); 
}); 
setInterval ("getList1()", 10000); 
var old = ""; 

function getEmployeeList1() { 
    $.getJSON(serviceURL + 'getemployees.php?' + formArray, function(data) { 
     if(data != old){ // data from the server is not same as old 
      $('#nollalista li').remove(); 
      keikka = data.key; 
      $.each(keikka, function(index, lista) { 
       $('#nollalista').append('<li><a href="employeedetails.html?id=' + lista.IND + '">' + 
         '<h4>' + lista.OSO + '</h4>' + 
         '<p>' + lista.AIKA + '</p>' +'</a></li>'); 
      }); 
      $('#nollalista').listview('refresh'); 

      if(old != "") 
       alert("New data!");   
      old = data; 
     } 
    }); 
} 
+2

你如何確定平等兩個JavaScript對象:HTTP:/ /stackoverflow.com/questions/201183/how-do-you-determine-equality-for-two-javascript-objects – fcalderan 2012-04-17 09:52:53

+4

** **從未傳遞的字符串爲'的setInterval()'或'的setTimeout()'。這樣做與使用'eval()'一樣糟糕,並且只要使用變量,就會導致不可讀和可能不安全的代碼,因爲您需要將它們插入到字符串中,而不是傳遞實際變量。正確的解決方案是'setInterval(function(){/ * your code *)},msecs);'。 'setTimeout()'同樣適用。如果你只是想調用一個函數不帶任何參數,你也可以直接傳遞函數名:'的setInterval(someFunction,毫秒);'(請注意,有沒有** **'()'函數名稱後面) – ThiefMaster 2012-04-17 09:53:03

回答

7

一個非常簡單的(但那種蹩腳的)解決方案是比較字符串表示:

if(JSON.stringify(a) != JSON.stringify(b)) { ... } 
+1

不錯,但要看無論如何,如果性能事項的順序或不 – fcalderan 2012-04-17 09:56:11

+0

該做的工作。謝謝! – user1256852 2012-04-17 10:06:16

+0

甚至更​​好的不要stringify,但只需使用ajax請求中未解析的responseText。 – Bergi 2012-04-17 10:31:02

1

你的代碼的警報每隔10秒,因爲你比較

if(data != old){ // data from the server is not same as old 

返回true,每次。

你可以使用這個庫中的JavaScript https://github.com/prettycode/Object.identical.js 比較JSON和修改比較

if(!Object.identical(data,old)){ // data from the server is not same as old 

用法:

var a = { x: "a", y: "b" }, 
b = { x: "a", y: "b" }, 
c = { y: "b", x: "a" }, 
d = { x: "Chris", y: "Prettycode.org", developerYears: [1994, 2011] }, 
e = { y: "Prettycode.org", developerYears: [1994, 2011], x: "Chris" }; 
f = { y: "Prettycode.org", developerYears: [2011, 1994], x: "Chris" }; 
console.log(Object.identical(a, b)); // true (same properties and same property values) 
console.log(Object.identical(a, c)); // true (object property order does not matter, simple) 
console.log(Object.identical(d, e)); // true (object property order does not matter, complex) 
console.log(Object.identical(d, f)); // false (arrays are, by definition, ordered)