2012-04-27 16 views
13

मैं निम्नलिखित 2 json वस्तुओं है कहते हैं:जावास्क्रिप्ट JSON तुलना/diff?

JSON A: 
{ 
"Field A":"1", 
"Field B":"2", 
"Field D":"Something", 
"Field E":"6" 
} 

JSON B: 
{ 
"Field A":"1", 
"Field B":"2", 
"Field C":"3", 
"Field D":"Different" 
} 

नमूना फंक्शन: समारोह (jsonstringA, jsonstringB)

उदाहरण (यदि JSON एक और JSON बी पैरामीटर के रूप में प्रयोग किया जाता):

रिटर्न एक नया JSON ऑब्जेक्ट युक्त:

{ 
"Field C":"3", // because function sees jsonstringB had no "Field C" 
"Field D": "Different" // sees jsonstringB had a different value for "Field D" 
} 

ध्यान दें कि यह तुलना के आधार के रूप में jsonstringA का उपयोग कर रहा है आइसन, इसलिए फ़ंक्शन केवल फ़ील्ड गुम हो जाता है और jsonStringB के मान देता है। यही कारण है कि "फील्ड ई" और इसका मूल्य वापस नहीं किया गया है।

एक ऐसे फ़ंक्शन के साथ आने के लिए सबसे अच्छा तरीका क्या है जो एक जेसन ऑब्जेक्ट को बदले गए मानों को वापस लाता है?

मैंने क्या किया है: मैंने उन क्षेत्रों को मैन्युअल रूप से निर्दिष्ट करके तुलना करने की कोशिश की है जिन्हें मैं जांचने की कोशिश कर रहा हूं, लेकिन मुझे ऐसा कुछ चाहिए जो मुझे "फ़ील्ड्स" को हार्डकोड न करने की आवश्यकता हो क्योंकि यह बहुत है अक्षम और हर बार जब मैं JSON B में एक नया फ़ील्ड जोड़ता हूं, मुझे उस क्षेत्र में हार्डकोड करना पड़ता है जिसे मैं ढूंढ रहा हूं ... यही कारण है कि मैं दर्द से कम कुछ ढूंढ रहा हूं।

+1

http://tlrobinson.net/projects/javascript-fun/jsondiff/ – Phrogz

+0

आप इस जवाब में कोड पर कुछ आधार कर सकते हैं: http://stackoverflow.com/a/1144249/562906 – sinelaw

उत्तर

11

इस तरह के एक समारोह को बनाना मुश्किल नहीं है। दूसरी वस्तु में प्रत्येक फ़ील्ड के माध्यम से बस लूप करें, और यदि यह पहले में मौजूद नहीं है या मान पहले से अलग है, तो उस फ़ील्ड को वापसी ऑब्जेक्ट में रखें।

var compareJSON = function(obj1, obj2) { 
    var ret = {}; 
    for(var i in obj2) { 
    if(!obj1.hasOwnProperty(i) || obj2[i] !== obj1[i]) { 
     ret[i] = obj2[i]; 
    } 
    } 
    return ret; 
}; 

आप इसे this demo page पर कार्रवाई में देख सकते हैं।

+0

आह, मेरी टिप्पणी को अनदेखा करें, मुझे लगता है कि वह ऑब्जेक्ट्स ए और बी के गुणों की परिवर्तनीय संख्या के लिए एक diff भी चाहता था। लेकिन ऐसा लगता है कि दोनों वस्तुओं में समान गुण हैं। –

+2

ओपी शायद ऑब्जेक्ट और सरणी मानों में पुन: कार्य करना चाहता है। – Phrogz

+0

@Phrogz मुझे यकीन नहीं है कि, उसके विवरण और उदाहरण से ऐसा लगता है कि एक उथले तुलना की तरह पर्याप्त है। –

3

आप json diff आवरण here

यह भी डेमो है page.You इस आवरण का उपयोग कर सकते है पर एक नज़र हो सकता है।

2

समारोह, बस क्या मैं के बाद था भी गैर के लिए उपयोगी है - JSON ऑब्जेक्ट तुलना

http://jsfiddle.net/muJEu/11/

भी गहरी नेस्टेड वस्तुओं के लिए इसे बढ़ाया।

isEmpty 

कई तरीकों से किया जा सकता है। देख Is object empty?

var compareObj = function(obj1, obj2) { 
    var ret = {},rett; 
    for(var i in obj2) { 
     rett = {}; 
     if (typeof obj2[i] === 'object'){ 
      rett = compareObj (obj1[i], obj2[i]) ; 
      if (!isEmpty(rett)){ 
      ret[i]= rett 
      }    
     }else{ 
      if(!obj1 || !obj1.hasOwnProperty(i) || obj2[i] !== obj1[i]) { 
       ret[i] = obj2[i]; 
     } 
    } 
    } 
    return ret; 
}; 
+0

यह मानता है कि कोई मान सरणी है, क्योंकि 'टाइपऑफ [] ===' ऑब्जेक्ट'' – SimplGy

+1

यह संपत्ति के रूप में 'obj1' में मौजूद है, लेकिन' obj2' में मौजूद नहीं है। उदाहरण: 'a = {a: true}' 'b = {b: true}'। 'तुलना ओबीजे (ए, बी) // रिटर्न {बी: सच}। आप उम्मीद कर सकते हैं कि {a: true, b: true} ' – SimplGy

+0

'rett' परिभाषित किया गया है, या यह वैश्विक चर है? – Jocie

संबंधित मुद्दे