2009-07-29 36 views
15

Tôi có hai đối tượng JSON trong Javascript, giống hệt nhau ngoại trừ các giá trị số. Có vẻ như sau:Sự khác biệt trong các đối tượng JSON sử dụng Javascript/JQuery

var data = { 
    "eth0":{"Tx":"4136675","Rx":"13232319"}, 
    "eth1":{"Tx":"4","Rx":"0"}, 
    "lo":{"Tx":"471290","Rx":"471290"} 
} 

var old = { 
    "eth0":{"Tx":"4136575","Rx":"13232219"}, 
    "eth1":{"Tx":"4","Rx":"0"}, 
    "lo":{"Tx":"471290","Rx":"471290"} 
} 

Một đối tượng được gọi là "dữ liệu" có giá trị hiện tại, một đối tượng khác có tên "cũ" có cùng giá trị từ 1 giây trước. Tôi muốn xuất một đối tượng JSON chỉ với các giá trị thay đổi để tôi có thể tính toán thông lượng dữ liệu trên giao diện mạng.

var throughput = { 
    "eth0":{"Tx":"100","Rx":"100"}, 
    "eth1":{"Tx":"0","Rx":"0"}, 
    "lo":{"Tx":"0","Rx":"0"} 
} 

Tôi không chắc chắn làm thế nào để đi về việc duyệt qua dữ liệu JSON - nó có thể là cho bất kỳ số lượng giao diện nào.

Có ai vui lòng cho tôi mượn tay không? Cảm ơn trước

+0

Một câu trả lời tốt cũng tìm thấy ở đây: [? Làm thế nào bạn có thể lập bản đồ sự khác biệt giữa các đối tượng JavaScript] (http://codereview.stackexchange.com/questions/11412/how-can-you-map-the- sự khác biệt giữa javascript-đối tượng/11580 # 11580) – laggingreflex

+0

để so sánh phía máy khách, có lẽ http://tlrobinson.net/projects/javascript-fun/jsondiff/ có thể hữu ích. – Veverke

Trả lời

7

Bạn có thể lặp qua các thuộc tính phụ huynh và đối tượng trẻ:

var diff = {}; 
for(var p in data){ 
    if (old.hasOwnProperty(p) && typeof(data[p]) == 'object'){ 
    diff[p] = {}; 
    for(var i in data[p]){ 
     if (old[p].hasOwnProperty(i)){ 
     diff[p][i] = data[p][i] - old[p][i]; 
     } 
    } 
    } 
} 
14

Những tiền đề cơ bản cho iterating trên các đối tượng trong JavaScript là như vậy

var whatever = {}; // object to iterate over 
for (var i in whatever) 
{ 
    if (whatever.hasOwnProperty(i)) 
    { 
    // i is the property/key name 
    // whatever[i] is the value at that property 
    } 
} 

Sửa lên một trình kiểm tra sẽ không quá khắt khe. Bạn sẽ cần đệ quy. Tôi sẽ để nó như một bài tập cho bạn hoặc một SOer khác.

4

này đã làm các trick cho tôi khi đối phó với một vấn đề tương tự. Nó được sự khác biệt trong thứ hai so với lần đầu tiên.

var first = originalObj; 
    var second = modifiedObj; 
    var diff = {}; 

    var differ = function(first, second, result) { 
     var i = 0; 
     for (i in first) { 
      if (typeof first[i] == "object" && typeof second[i] == "object") { 
       result[i] = differ(first[i], second[i], {}); 
       if (!result[i]) delete result[i]; 
      } else if (first[i] != second[i]) { 
       result[i] = second[i]; 
      } 
     } 
     return isEmpty(result) ? undefined : result; 
    } 

    differ(old_conf, new_conf, diff); 

Mã là một chút của một trường hợp đặc biệt, nhưng bạn sẽ có được ý tưởng chung: P

8

Có lẽ nó đã được trả lời đầy đủ, nhưng hãy để tôi thêm không biết xấu hổ cắm của tôi :) Một JSON (trên thực tế bất kỳ javascript đối tượng hoặc mảng cấu trúc) diff & thư viện vá tôi nguồn mở tại github:

https://github.com/benjamine/jsondiffpatch

nó tạo diffs (cũng ở định dạng JSON, và với một dấu chân nhỏ), mà bạn có thể sử dụng cl ient (kiểm tra trang kiểm tra) & phía máy chủ và nếu có, nó sử dụng http://code.google.com/p/google-diff-match-patch/ cho các chuỗi dài tự động.

kiểm tra trang DEMO để xem cách hoạt động.

+0

+1 Thuật toán khác biệt json tinh vi, ví dụ: với các thuộc tính chuỗi, quyết định có nên sử dụng chuỗi * trước * và * sau * hay làm một chuỗi khác ** bên trong **, tùy thuộc vào độ dài của kết quả khác nhau (tôi giả định). –

+0

Có, sự khác biệt về văn bản được thực hiện khi tìm thấy 2 chuỗi dài (có thể cấu hình được bao lâu) (để giảm kích thước khác biệt, và cũng để cho phép vá mờ). – Benja

0

Bạn có thể sử dụng mô-đun truyền tải đối tượng như nervgh/object-traverse để thực hiện việc này.

var result = {} 
Object.traverse(old, function(node, value, key, path) { 
    var resultObject = result 
    for(var n=0; n<path.length-1; n++) { 
    resultObject = resultObject[path[n]] 
    } 
    resultObject[key] = value 
}); 
Các vấn đề liên quan