2010-04-01 8 views
6

यदि मेरे पास दो सहयोगी सरणी हैं, तो उनके मूल्यों के खिलाफ अंतर करने का सबसे प्रभावी तरीका क्या होगा?जावास्क्रिप्ट/jQuery में एक एसोसिएटिव ऐरे पर "डिफ" करना?

उदाहरण के लिए, दिए गए:

array1 = { 
    foreground: 'red', 
    shape: 'circle', 
    background: 'yellow' 
    }; 

    array2 = { 
    foreground: 'red', 
    shape: 'square', 
    angle: '90', 
    background: 'yellow' 
    }; 

मैं कैसे दूसरे के खिलाफ एक जाँच करेगा, आइटम लापतायाअतिरिक्त कि इस तरह सरणी जिसके परिणामस्वरूप कर रहे हैं। इस मामले में, अगर मैं array2 भीतर array1 तुलना करने के लिए चाहता था, यह वापसी होगी:

array3 = {shape: 'circle'} 

जबकि अगर मैं array1 भीतर array2 तुलना में, यह वापसी होगी:

array3 = {shape: 'square', angle: '90'} 

धन्यवाद अग्रिम में आपकी मदद के लिए!

उत्तर

7

इस प्रयास करें:

function diff(obj1, obj2) { 
    var result = {}; 
    $.each(obj1, function (key, value) { 
     if (!obj2.hasOwnProperty(key) || obj2[key] !== obj1[key]) { 
      result[key] = value; 
     } 
    }); 

    return result; 
} 
3

आप PHP वाक्य रचना से परिचित हैं, जो लगभग सभी PHP के सरणी संबंधित सहित जावास्क्रिप्ट – में तब्दील कर कार्य शामिल हैं http://phpjs.org/functions/index पर एक नज़र डालें array_diff

1

RaYell के समाधान अच्छा है लेकिन दुर्भाग्यवश केवल आपको obj2 में आइटम बताएंगे जो ओबीजे 1 में अलग या अस्तित्वहीन हैं, अगर हमें दोनों तरफ जानना है, तो सभी चाबियाँ प्राप्त करें और फिर तुलना करें। निम्न कार्य प्रत्येक ऑब्जेक्ट के लिए महत्वपूर्ण मानों के साथ एक सहयोगी सरणी लौटाएगा। ओह ... निष्पक्ष होने के लिए, मैंने अभी तक परीक्षण नहीं किया है, लेकिन यह काम करना चाहिए।

var diff = function(obj1,obj2) { 
    var newObj = $.extend({},obj1,obj2); 
    var result = {}; 
    $.each(newObj, function (key, value) { 
     if (!obj2.hasOwnProperty(key) || !obj1.hasOwnProperty(key) || obj2[key] !== obj1[key]) { 
     result[key] = [obj1[key],obj2[key]]; 
     } 
    }); 

    return result; 
} 

ओह, और जब तक मैं पहचान है कि पहले समाधान प्रारंभिक सवाल का जवाब, मुझे लगता है कि इसके बाद के संस्करण समाधान एक और दृष्टिकोण प्रारंभिक उपयोगकर्ता उपयोगी लग सकते है कि इतनी के रूप में दो बार की जाँच की आवश्यकता नहीं है।

0

यह तुम क्या जरूरत है की तुलना में अधिक कृत्रिम हो सकता है, लेकिन आप मेरी jsondiffpatch lib कि javascript ऑब्जेक्ट के किसी भी जोड़े diff होगा की कोशिश कर सकते हैं:

https://github.com/benjamine/jsondiffpatch

आप इसे परीक्षण करना चाहते हैं यदि आप इसे देख सकते हैं http://benjamine.github.com/jsondiffpatch/demo/index.html

में रहें

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

  • कोई संबंधित समस्या नहीं^_^