दिलचस्प पोस्ट
PHP में एक वेरिएबल से एक वर्ग को इन्स्तांत करना है? उबंटू कहते हैं, "बीश: .प्रोग्राम की अनुमति अस्वीकृत" Console.log में गलत मान प्रविष्टि के आदेश के आधार पर हेट पर फेंकना है? कुकीज़ सर्वर-पक्ष को हटाने का सही तरीका शुद्ध सीएसएस पतन / div विस्तृत करें आईओएस के माध्यम से एनिमेटेड जीआईआईएफ़ बनाना और निर्यात करना है? कैसे मैवेन के ग्रहण प्लगइन में निर्भरता के लिए javadocs को संदर्भित करें जब javadoc निर्भरता से जुड़ा नहीं है एक्सएमएल बीओएम क्या है और मैं इसे कैसे पहचानूं? अलग ऊंचाई के कॉलम के साथ बूटस्ट्रैप पंक्ति कैसे एक सूची की एक नई गहरी कॉपी (क्लोन) बनाएँ <टी>? मैं पूरी तरह से HTTP अनुरोध कैसे देख सकता हूं जो कि मेरे पायथन एप्लिकेशन द्वारा भेजा जा रहा है? String.equals () तर्क क्रम मुझे जावा में पर्ल स्क्रिप्ट को कैसे कॉल करना चाहिए? जीआईटी: एक विशिष्ट फ़ोल्डर में चेकआउट

जावास्क्रिप्ट में ऑब्जेक्ट्स के दो सरणी के बीच अंतर

मेरे पास दो परिणाम इस तरह सेट हैं;

// Result 1 [ { value="4a55eff3-1e0d-4a81-9105-3ddd7521d642", display="Jamsheer" }, { value="644838b3-604d-4899-8b78-09e4799f586f", display="Muhammed" }, { value="b6ee537a-375c-45bd-b9d4-4dd84a75041d", display="Ravi" }, { value="e97339e1-939d-47ab-974c-1b68c9cfb536", display="Ajmal" }, { value="a63a6f77-c637-454e-abf2-dfb9b543af6c", display="Ryan" } ] // Result 2 [ { value="4a55eff3-1e0d-4a81-9105-3ddd7521d642", display="Jamsheer", $$hashKey="008" }, { value="644838b3-604d-4899-8b78-09e4799f586f", display="Muhammed", $$hashKey="009" }, { value="b6ee537a-375c-45bd-b9d4-4dd84a75041d", display="Ravi", $$hashKey="00A" }, { value="e97339e1-939d-47ab-974c-1b68c9cfb536", display="Ajmal", $$hashKey="00B" } ] 

अंतिम परिणाम मुझे चाहिए कि इन सरणियों के बीच का अंतर है, अर्थात् अंतिम परिणाम इस तरह दिखता है

 [{ value="a63a6f77-c637-454e-abf2-dfb9b543af6c", display="Ryan" }] 

क्या जावास्क्रिप्ट में ऐसा कुछ करना संभव है?

वेब के समाधान से एकत्रित समाधान "जावास्क्रिप्ट में ऑब्जेक्ट्स के दो सरणी के बीच अंतर"

केवल देशी जेएस का उपयोग करना, ऐसा कुछ काम करेगा:

 a = [{ value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642", display:"Jamsheer"}, { value:"644838b3-604d-4899-8b78-09e4799f586f", display:"Muhammed"}, { value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d", display:"Ravi"}, { value:"e97339e1-939d-47ab-974c-1b68c9cfb536", display:"Ajmal"}, { value:"a63a6f77-c637-454e-abf2-dfb9b543af6c", display:"Ryan"}] b = [{ value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642", display:"Jamsheer", $$hashKey:"008"}, { value:"644838b3-604d-4899-8b78-09e4799f586f", display:"Muhammed", $$hashKey:"009"}, { value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d", display:"Ravi", $$hashKey:"00A"}, { value:"e97339e1-939d-47ab-974c-1b68c9cfb536", display:"Ajmal", $$hashKey:"00B"}] function comparer(otherArray){ return function(current){ return otherArray.filter(function(other){ return other.value == current.value && other.display == current.display }).length == 0; } } var onlyInA = a.filter(comparer(b)); var onlyInB = b.filter(comparer(a)); result = onlyInA.concat(onlyInB); console.log(result); 

आप Array.prototype.filter() में Array.prototype.some() साथ संयोजन में उपयोग कर सकते हैं।

यहां एक उदाहरण है (मानते हुए कि आपके एरेज़ को result1 और result1 में संग्रहीत किया जाता है):

 //Find values that are in result1 but not in result2 var uniqueResultOne = result1.filter(function(obj) { return !result2.some(function(obj2) { return obj.value == obj2.value; }); }); //Find values that are in result2 but not in result1 var uniqueResultTwo = result2.filter(function(obj) { return !result1.some(function(obj2) { return obj.value == obj2.value; }); }); //Combine the two arrays of unique entries var result = uniqueResultOne.concat(uniqueResultTwo); 

मैं थोड़ा और अधिक सामान्य उद्देश्य वाला दृष्टिकोण लेता हूं, हालांकि विचारों के समान @ कैरब्रस और @ कैस्पर मोअरच दोनों के दृष्टिकोण के लिए मैं एक ऐसा फ़ंक्शन बनाता हूं जो यह निर्धारित करने के लिए एक निस्संदेह स्वीकार करता है कि दो ऑब्जेक्ट बराबर हैं (यहां हम $$hashKey संपत्ति को अनदेखा करते हैं, लेकिन यह कुछ भी हो सकता है) और उस फ़ंक्शन को वापस लौटाते हैं जो उस $$hashKey आधार पर दो सूचियों के सममित अंतर की गणना करता है:

 a = [{ value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642", display:"Jamsheer"}, { value:"644838b3-604d-4899-8b78-09e4799f586f", display:"Muhammed"}, { value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d", display:"Ravi"}, { value:"e97339e1-939d-47ab-974c-1b68c9cfb536", display:"Ajmal"}, { value:"a63a6f77-c637-454e-abf2-dfb9b543af6c", display:"Ryan"}] b = [{ value:"4a55eff3-1e0d-4a81-9105-3ddd7521d642", display:"Jamsheer", $$hashKey:"008"}, { value:"644838b3-604d-4899-8b78-09e4799f586f", display:"Muhammed", $$hashKey:"009"}, { value:"b6ee537a-375c-45bd-b9d4-4dd84a75041d", display:"Ravi", $$hashKey:"00A"}, { value:"e97339e1-939d-47ab-974c-1b68c9cfb536", display:"Ajmal", $$hashKey:"00B"}] var makeSymmDiffFunc = (function() { var contains = function(pred, a, list) { var idx = -1, len = list.length; while (++idx < len) {if (pred(a, list[idx])) {return true;}} return false; }; var complement = function(pred, a, b) { return a.filter(function(elem) {return !contains(pred, elem, b);}); }; return function(pred) { return function(a, b) { return complement(pred, a, b).concat(complement(pred, b, a)); }; }; }()); var myDiff = makeSymmDiffFunc(function(x, y) { return x.value === y.value && x.display === y.display; }); var result = myDiff(a, b); //=> {value="a63a6f77-c637-454e-abf2-dfb9b543af6c", display="Ryan"} 

सेरेब्रस के दृष्टिकोण पर इसका एक मामूली फायदा है (जैसा कि कास्पर मोअरच का दृष्टिकोण है) में यह जल्दी बचता है; अगर यह एक मैच पाता है, तो यह बाकी की सूची की जांच करने में परेशान नहीं करता है। अगर मेरे पास curry फ़ंक्शन होता है, तो मैं इसे थोड़ा अलग करता हूं, लेकिन यह ठीक काम करता है।

व्याख्या

एक टिप्पणी ने शुरुआती के लिए अधिक विस्तृत व्याख्या के लिए कहा। यहाँ एक प्रयास है

हम बनाने के लिए निम्नलिखित फ़ंक्शन पास makeSymmDiffFunc :

 function(x, y) { return x.value === y.value && x.display === y.display; } 

यह फ़ंक्शन हम यह तय करते हैं कि दो ऑब्जेक्ट समान हैं। ऐसे सभी कार्यों की तरह जो true या false , इसे "विधेय समारोह" कहा जा सकता है, लेकिन यह सिर्फ शब्दावली है मुख्य बिंदु यह है कि makeSymmDiffFunc एक फ़ंक्शन के साथ कॉन्फ़िगर किया गया है जो दो ऑब्जेक्ट स्वीकार करता है और अगर हम इन्हें समान मानते हैं, तो वह true देता true यदि हम नहीं करते हैं।

इसका प्रयोग करना, makeSymmDiffFunc ("सममित अंतर फ़ंक्शन बनाना") हमें एक नया कार्य देता है:

  return function(a, b) { return complement(pred, a, b).concat(complement(pred, b, a)); }; 

यह फ़ंक्शन हम वास्तव में उपयोग करेंगे। हम इसे दो सूचियों को पास करते हैं और यह पहले के तत्वों को पहले में नहीं पाता है, फिर वे दूसरे में नहीं हैं और इन दो सूचियों को जोड़ते हैं।

इसे फिर से देखिए, हालांकि, मैं निश्चित रूप से आपके कोड से क्यू लिया होगा और मुख्य फ़ंक्शन को some का उपयोग करके काफी सरल कर सकता हूं:

 var makeSymmDiffFunc = (function() { var complement = function(pred, a, b) { return a.filter(function(x) { return !b.some(function(y) {return pred(x, y);}); }); }; return function(pred) { return function(a, b) { return complement(pred, a, b).concat(complement(pred, b, a)); }; }; }()); 

complement का उपयोग करता है और अपनी दूसरी सूची के तत्वों को वापस नहीं देता है यह एक अलग contains फ़ंक्शन के साथ मेरी पहली पास की तुलना में आसान है।

अंत में, मुख्य कार्य को एक आंतरिक आंतक समारोह को वैश्विक दायरे से बाहर रखने के लिए एक तत्काल लागू समारोह अभिव्यक्ति ( आईआईएफई ) में लपेटा हुआ है।

मुझे लगता है कि @ कैरब्रस समाधान पर मौजूद है। मैंने एक ही समाधान लागू किया है, लेकिन दोहराए गए कोड को अपने स्वयं के फ़ंक्शन (DRY) में निकाला है।

  function filterByDifference(array1, array2, compareField) { var onlyInA = differenceInFirstArray(array1, array2, compareField); var onlyInb = differenceInFirstArray(array2, array1, compareField); return onlyInA.concat(onlyInb); } function differenceInFirstArray(array1, array2, compareField) { return array1.filter(function (current) { return array2.filter(function (current_b) { return current_b[compareField] === current[compareField]; }).length == 0; }); } 

मैंने एक सामान्यीकृत अंतर बना दिया है जो किसी भी प्रकार की 2 वस्तुओं की तुलना करता है और एक संशोधन हैंडलर gist.github.com/bortunac "diff.js" का प्रयोग करने का एक पूर्व चला सकता है:

 old_obj={a:1,b:2,c:[1,2]} now_obj={a:2 , c:[1,3,5],d:55} 

इसलिए संपत्ति को संशोधित किया जाता है, ख हटाया जाता है, सी संशोधित, घ जोड़ा जाता है

 var handler=function(type,pointer){ console.log(type,pointer,this.old.point(pointer)," | ",this.now.point(pointer)); 

}

अब जैसे उपयोग करें

 df=new diff(); df.analize(now_obj,old_obj); df.react(handler); 

कंसोल दिखाएगा

 mdf ["a"] 1 | 2 mdf ["c", "1"] 2 | 3 add ["c", "2"] undefined | 5 add ["d"] undefined | 55 del ["b"] 2 | undefined 
 import differenceBy from 'lodash/differenceBy' const myDifferences = differenceBy(Result1, Result2, 'value') 

यह वस्तुओं के दो सरणियों के बीच अंतर को लौटा देगा, उनकी तुलना करने के लिए महत्वपूर्ण value का उपयोग कर। दो चीजों को उसी मूल्य के साथ नोट करें, क्योंकि अन्य की उपेक्षा नहीं की जाती है।

यह रद्दी का एक हिस्सा है।

यदि आप बाहरी पुस्तकालयों का उपयोग करने के लिए तैयार हैं, तो आप इसे प्राप्त करने के लिए अंडरस्कोर.ज में _.difference का उपयोग कर सकते हैं। _.difference अन्य सरणियों में मौजूद नहीं हैं जो सरणी से मान देता है

 _.difference([1,2,3,4,5][1,4,10]) ==>[2,3,5]