2012-02-08 20 views
5

मेरे पास दो सरणी हैं। प्रत्येक सरणी में मेरे पास बहुत सारी संपत्तियों वाली वस्तुएं हैं लेकिन कोई विधि नहीं है। मैं अगर सरणी 1 सरणी के साथ बराबर है 2.वस्तुओं के सरणी की तुलना करें, इष्टतम तरीका

एक तरह से करने के लिए है कि एक समारोह है कि एक सरणी के प्रत्येक तत्व के माध्यम से पारित बना सकते हैं और समान में वस्तु के साथ वस्तु के प्रत्येक प्रॉपर्टी की तुलना करने होगा देखने की जरूरत दूसरी सरणी में स्थिति।

समस्या यह है कि सरणी काफी बड़ी हैं और प्रत्येक ऑब्जेक्ट में बहुत सारी गुण हैं। अगर कोई दूसरा रास्ता हो तो मैं घूम रहा था। उदाहरण के लिए सी ++ में मैं स्मृति पढ़ सकता था ... लेकिन मुझे नहीं पता कि जेएस में ऐसा कैसे करें।

मुझे सबसे इष्टतम तरीका प्राप्त करने की आवश्यकता है क्योंकि यह अक्सर उपयोग किए जाने वाले फ़ंक्शन का हिस्सा होता है।

+0

[विशिष्ट मानों से सरणी के जावास्क्रिप्ट सरणी की तुलना करें] (http://stackoverflow.com/questions/18657232/compare-javascript-array-of-array-by-distinct-values) यह कोड आपकी मदद कर सकता है। – Jugal

उत्तर

4

जब तक वे एक ही सरणी उदाहरण हैं, मेमोरी स्थानों की तुलना जावास्क्रिप्ट में काम नहीं करेगा (क्या होता है जब आप arr1 == arr2 करते हैं)।

आपको स्पष्ट रूप से लूप की आवश्यकता होगी।

कुछ लोगों का उपयोग JSON.stringify() दोनों सरणियों पर (के लिए पकड़ लिया pimvdb द्वारा टिप्पणी में समझाया देखना) और के परिणामस्वरूप तार तुलना धोखा बल्कि एक स्ट्रिंग के लिए serialising और मेरे लिए पूरी तरह से महंगा से अधिक ध्वनियों की तुलना। हालांकि यह काम करता है, इसलिए यदि कोई प्रदर्शन समस्या नहीं है, तो पागल हो जाओ! :)

आप toSource() भी आजमा सकते हैं।

मैं अपना खुद का तुलनात्मक कार्य तैयार करूंगा जो कि केवल समान के मेरे विचार को संतुष्ट करता है।

+0

प्रदर्शन समस्या है :)। यदि मैं तुलना करता हूं कि arr1 == arr2 हमेशा झूठी वापसी करेगा क्योंकि स्मृति स्थान अलग है। मुझे उस स्थान से स्मृति को "स्मृति शर्तों में" सरणी के अंत तक तुलना करने की आवश्यकता है ताकि इसे दूसरे स्थान के साथ अंत में रखा जा सके। अनुलेख कृपया मेरी अंग्रेजी क्षमा करें। – zozo

+2

@zozo जावास्क्रिप्ट सरणी वास्तव में कुछ विशेष तरीकों और गुणों के साथ वस्तुएं हैं। वे आमतौर पर अन्य भाषाओं के एरे के कार्यान्वयन की तरह क्रमशः संग्रहीत नहीं होते हैं। – alex

+0

आप सी ++ में सीधे मेमोरी को एड्रेस तक नहीं पहुंच सकते हैं। जावास्क्रिप्ट सिर्फ एक गूंगा इंटरफ़ेस है और आप जो कुछ भी कर सकते हैं वह वस्तुओं की तुलना किसी भी तरह से करता है। मैं 'JSON.stringify' का भी उपयोग करूंगा। 'असमान' भी है। –

0

JQuery

$.param(originalObj) == $.param(modifiedObj) 

यह jQuery.extend() के साथ conjuction में बहुत शक्तिशाली है एक समारोह jQuery.param() कहा जाता है जो वस्तुओं

आप वस्तुओं या तो वस्तुओं की तरह सरणियों की तुलना कर सकते serializes, जो वस्तुओं

क्लोन करने के लिए इस्तेमाल किया जा सकता है
1

तार करने के लिए अपने सरणियों परिवर्तित और फिर तार की तुलना में समान औसत और सबसे खराब प्रदर्शन करना होगा: हे (एन) (लीनियर)।

यदि आप अपनी ऑब्जेक्ट्स गुणों/सरणीओं के माध्यम से लूप करते हैं और पहले विसंगति पर निरस्त हो जाते हैं तो आपका सबसे खराब प्रदर्शन अभी भी ओ (एन) होगा, लेकिन आपका औसत प्रदर्शन तब तक बेहतर हो सकता है जब तक आपके द्वारा तुलना की जाने वाली वस्तुओं को आम तौर पर समान न हो। किसी भी तरह से, चूंकि इस ट्रैवर्सल में कोई भी नई ऑब्जेक्ट्स बनाने और बाइट्स को प्रतिलिपि बनाने में शामिल नहीं होगा - यहां तक ​​कि समान समग्र ऑब्जेक्ट्स/सरणी (सबसे खराब केस) की तुलना करना भी उन्हें स्ट्रिंग करने से तेज होना चाहिए। this जवाब पता चलता है

के रूप में आप सिर्फ Underscore.js isEqual इस्तेमाल कर सकते हैं:

जो डॉक्स के अनुसार: दो वस्तुओं के बीच एक अनुकूलित गहरी तुलना करता है, यह निर्धारित करने के वे बराबर किया जाए या नहीं

मैं बहुत यकीन है कि यह भी सरणी के लिए काम करेगा।

+0

आप सही हैं। +1 – zozo

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