2010-12-16 18 views
45

संभव डुप्लिकेट:
Object comparison in JavaScriptतुलना करें 2 JSON वस्तुओं

वहाँ कोई भी तरीका है कि 2 JSON ऑब्जेक्ट में ले जाता है और 2 तुलना करता है, तो किसी भी डेटा बदल गया है देखने के लिए है?

संपादित

टिप्पणियों की समीक्षा करने के बाद, कुछ स्पष्टीकरण की जरूरत है।

  1. एक JSON ऑब्जेक्ट

    "नाम/मान युग्म के एक अव्यवस्थित सेट के रूप में परिभाषित किया गया है। एक वस्तु { (बाएं ब्रेस) और के साथ समाप्त होता} के साथ शुरू होता (दायां कोष्ठक) प्रत्येक। नाम का पालन किया जाता है: (कोलन) और नाम/मूल्य जोड़े (अल्पविराम) द्वारा अलग किए जाते हैं। " - json.org

  2. मेरा लक्ष्य 2 JSON ऑब्जेक्ट शाब्दिक, सीधे शब्दों में तुलना करने के लिए सक्षम होने के लिए है।

मैं एक जावास्क्रिप्ट गुरु अगर ऐसा है, जावास्क्रिप्ट में, इन वस्तु शाब्दिक हैं, तो मुझे लगता है कि मैं उन्हें क्या बुलाना चाहिए है नहीं कर रहा हूँ।

मेरा मानना ​​है कि मैं क्या देख रहा हूँ एक विधि के लिए सक्षम है: दोनों वस्तु शाब्दिक की लंबाई निर्धारित एक अनूठा नाम/मान युग्म

  • मिल जाए, और नाम/मान की तुलना करने के

    1. दीप प्रत्यावर्तन यह देखने के लिए जोड़े कि क्या कोई विसंगति मौजूद है या नहीं।
  • +2

    JSON ऑब्जेक्ट की तरह कुछ भी नहीं है। या तो JSON स्ट्रिंग या जावास्क्रिप्ट ऑब्जेक्ट, लेकिन इनमें से किसी एक का संयोजन नहीं है (ठीक है, शायद जावास्क्रिप्ट स्ट्रिंग मौजूद है;))। –

    +0

    @ mjw06d क्या आप ऑब्जेक्ट्स के लिए जेएसओएन होने वाली तारों की तुलना करना चाहते हैं, या आप दो मौजूदा जावास्क्रिप्ट 'ऑब्जेक्ट' उदाहरणों की तुलना करना चाहते हैं? – Phrogz

    +4

    @ फ़ेलिक्स क्लिंग, आप सही हैं लेकिन बातचीतत्मक रूप से मेरे लिए एक "JSON ऑब्जेक्ट" का अर्थ है जावा में जिसे पीओजेओ कहा जाता है ... एक सादा वस्तु जिसमें केवल एक (पदानुक्रम) प्राइमेटिव होता है, एक कन्स्ट्रक्टर के साथ ऑब्जेक्ट के विपरीत, निजी या सार्वजनिक कार्यों आदि ... तकनीकी रूप से सही नहीं है, लेकिन यह सवाल को समझने में मदद करता है। –

    उत्तर

    16

    सीधे शब्दों में JSON को पार्स और दो वस्तुओं की तुलना क्योंकि पर्याप्त नहीं यह ठीक उसी वस्तु संदर्भ नहीं होगा (लेकिन एक ही मूल्यों हो सकता है) है।

    आपको गहरे बराबर करने की आवश्यकता है।

    http://threebit.net/mail-archive/rails-spinoffs/msg06156.html से - जो jQuery का उपयोग करता है।

    Object.extend(Object, { 
        deepEquals: function(o1, o2) { 
        var k1 = Object.keys(o1).sort(); 
        var k2 = Object.keys(o2).sort(); 
        if (k1.length != k2.length) return false; 
        return k1.zip(k2, function(keyPair) { 
         if(typeof o1[keyPair[0]] == typeof o2[keyPair[1]] == "object"){ 
         return deepEquals(o1[keyPair[0]], o2[keyPair[1]]) 
         } else { 
         return o1[keyPair[0]] == o2[keyPair[1]]; 
         } 
        }).all(); 
        } 
    }); 
    
    Usage: 
    
    var anObj = JSON.parse(jsonString1); 
    var anotherObj= JSON.parse(jsonString2); 
    
    if (Object.deepEquals(anObj, anotherObj)) 
        ... 
    
    +0

    अगर मैं गलत हूं, तो मुझे सही करें, लेकिन मुझे पूरा यकीन है कि यह एक गहरी रिकर्सिव विधि नहीं है। ऐसा लगता है कि यह केवल 1 स्तर के लिए काम करेगा। –

    +0

    नेस्टेड ऑब्जेक्ट्स के साथ काम करने के लिए फ़ंक्शन को अपडेट किया गया। –

    +0

    मुझे लगता है कि निम्न पंक्ति टूटी हुई है: 'अगर (टाइपो ओ 1 [..] == टाइपो ओ 2 [..] == "ऑब्जेक्ट")' ... क्योंकि पहली तुलना एक बूलियन लौटाएगी। –

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