मेरे पास दो वस्तुएं हैं: oldObj
और newObj
।
oldObj
किसी प्रपत्र को पॉप्युलेट करने के लिए डेटा का उपयोग किया गया था और newObj
यह इस रूप में उपयोगकर्ता के डेटा को बदलने और सबमिट करने का परिणाम है।
दोनों वस्तुएं गहरी हैं, अर्थात। उनके पास ऐसे गुण हैं जो ऑब्जेक्ट्स या ऑब्जेक्ट्स के एरेज़ आदि हैं - वे एन लेवल डीप हो सकते हैं, इस प्रकार अलग एल्गोरिथ्म को पुनरावर्ती होने की आवश्यकता होती है।
अब मैं सिर्फ (में के रूप में जोड़ा / अद्यतन / हटाए गए) को समझ नहीं करने के लिए क्या बदल गया था से जरूरत oldObj
के लिए newObj
, लेकिन यह भी सबसे अच्छा करने के लिए कैसे यह प्रतिनिधित्व करते हैं।
अब तक मेरे विचार सिर्फ एक ऐसी genericDeepDiffBetweenObjects
विधि का निर्माण करना था जो किसी वस्तु को फॉर्म में लौटा दे {add:{...},upd:{...},del:{...}}
लेकिन फिर मैंने सोचा: इससे पहले किसी और व्यक्ति को इसकी आवश्यकता होगी।
तो ... क्या किसी को पुस्तकालय या कोड का एक टुकड़ा पता है जो ऐसा करेगा और हो सकता है कि अंतर का प्रतिनिधित्व करने का एक और भी बेहतर तरीका हो (एक तरह से जो अभी भी जेएसएन धारावाहिक है)?
अपडेट करें:
मैंने अद्यतन डेटा का प्रतिनिधित्व करने के लिए एक बेहतर तरीका सोचा है, उसी वस्तु संरचना का उपयोग करके newObj
, लेकिन सभी संपत्ति मूल्यों को ऑब्जेक्ट में बदलकर:
{type: '<update|create|delete>', data: <propertyValue>}
तो अगर newObj.prop1 = 'new value'
और oldObj.prop1 = 'old value'
यह सेट होगाreturnObj.prop1 = {type: 'update', data: 'new value'}
अपडेट 2:
जब हम एरीज़ के गुणों को प्राप्त करते हैं, तो यह बालों के रंग में हो जाता है, क्योंकि सरणी [1,2,3]
को बराबर के रूप में गिना जाना चाहिए [2,3,1]
, जो कि स्ट्रिंग, इंट & बूल जैसे मूल्य आधारित प्रकारों के सरणियों के लिए पर्याप्त सरल है, लेकिन जब यह आता है तो संभालना वास्तव में मुश्किल हो जाता है वस्तुओं और सरणियों जैसे संदर्भ प्रकारों के सरणियाँ।
उदाहरण सरणियाँ जो समान पाई जानी चाहिए:
[1,[{c: 1},2,3],{a:'hey'}] and [{a:'hey'},1,[3,{c: 1},2]]
न केवल इस प्रकार के गहरे मूल्य समानता के लिए जांच करना काफी जटिल है, बल्कि उन परिवर्तनों का प्रतिनिधित्व करने के लिए एक अच्छा तरीका भी पता लगाना है जो हो सकते हैं।
newObj
DOM में एक फॉर्म से js कोड रीडिंग वैल्यूज द्वारा जेनरेट किया जाता है। राज्य को बनाए रखने और इसे बहुत आसान करने के कई तरीके हैं, लेकिन मैं इसे एक अभ्यास के रूप में स्टेटलेस रखना चाहूंगा। इसके अलावा, मैं यह देखने के लिए पूर्व कला की तलाश कर रहा हूं कि दूसरों ने इससे कैसे निपट लिया है, अगर वास्तव में किसी के पास है।