जैसा कि पूछा गया था, यहाँ एक पुनरावर्ती वस्तु तुलनात्मक कार्य है। और थोड़ा और। यह मानते हुए कि इस तरह के समारोह का प्राथमिक उपयोग वस्तु निरीक्षण है, मुझे कुछ कहना है। पूर्ण गहन तुलना एक बुरा विचार है जब कुछ अंतर अप्रासंगिक होते हैं। उदाहरण के लिए, टीडीडी अभिकथन में अंधा गहरी तुलना परीक्षणों को अनावश्यक भंगुर बना देती है। उस कारण से, मैं बहुत अधिक मूल्यवान आंशिक अंतर पेश करना चाहता हूं । यह इस धागे के लिए पिछले योगदान का एक पुनरावर्ती एनालॉग है। यह कुंजी में मौजूद नहीं है
var bdiff = (a, b) =>
_.reduce(a, (res, val, key) =>
res.concat((_.isPlainObject(val) || _.isArray(val)) && b
? bdiff(val, b[key]).map(x => key + '.' + x)
: (!b || val != b[key] ? [key] : [])),
[]);
BDiff अन्य गुणों को सहन करते हुए अपेक्षित मूल्यों की जांच करने की अनुमति देता है, जो कि स्वचालित निरीक्षण के लिए आप चाहते हैं । यह सभी प्रकार के उन्नत अभिकथन के निर्माण की अनुमति देता है। उदाहरण के लिए:
var diff = bdiff(expected, actual);
// all expected properties match
console.assert(diff.length == 0, "Objects differ", diff, expected, actual);
// controlled inequality
console.assert(diff.length < 3, "Too many differences", diff, expected, actual);
पूर्ण समाधान पर लौट रहे हैं। Bdiff के साथ एक पूर्ण पारंपरिक रूप का निर्माण तुच्छ है:
function diff(a, b) {
var u = bdiff(a, b), v = bdiff(b, a);
return u.filter(x=>!v.includes(x)).map(x=>' < ' + x)
.concat(u.filter(x=>v.includes(x)).map(x=>' | ' + x))
.concat(v.filter(x=>!u.includes(x)).map(x=>' > ' + x));
};
दो जटिल वस्तुओं पर फ़ंक्शन के ऊपर चलने से यह कुछ समान होगा:
[
" < components.0.components.1.components.1.isNew",
" < components.0.cryptoKey",
" | components.0.components.2.components.2.components.2.FFT.min",
" | components.0.components.2.components.2.components.2.FFT.max",
" > components.0.components.1.components.1.merkleTree",
" > components.0.components.2.components.2.components.2.merkleTree",
" > components.0.components.3.FFTResult"
]
अंत में, मूल्यों में अंतर होने के बारे में एक झलक पाने के लिए, हम सीधे आउटपुट को अलग करना () कर सकते हैं । उसके लिए, हमें bdiff के एक बदसूरत संस्करण की आवश्यकता है जो कि वाक्यविन्यास को सही तरीके से आउटपुट करता है:
// provides syntactically correct output
var bdiff = (a, b) =>
_.reduce(a, (res, val, key) =>
res.concat((_.isPlainObject(val) || _.isArray(val)) && b
? bdiff(val, b[key]).map(x =>
key + (key.trim ? '':']') + (x.search(/^\d/)? '.':'[') + x)
: (!b || val != b[key] ? [key + (key.trim ? '':']')] : [])),
[]);
// now we can eval output of the diff fuction that we left unchanged
diff(a, b).filter(x=>x[1] == '|').map(x=>[x].concat([a, b].map(y=>((z) =>eval('z.' + x.substr(3))).call(this, y)))));
यह इस तरह से कुछ उत्पादन होगा:
[" | components[0].components[2].components[2].components[2].FFT.min", 0, 3]
[" | components[0].components[2].components[2].components[2].FFT.max", 100, 50]
एमआईटी लाइसेंस;)