যেমনটি জিজ্ঞাসা করা হয়েছিল, এখানে একটি পুনরাবৃত্ত বস্তুর তুলনা ফাংশন। এবং আরও কিছু। এই ধরণের ফাংশনটির প্রাথমিক ব্যবহারটি অবজেক্ট ইন্সপেকশন বলে ধরে নেওয়া, আমার কিছু বলার আছে। সম্পূর্ণ পার্থক্য তুলনা একটি খারাপ ধারণা যখন কিছু পার্থক্য অপ্রাসঙ্গিক হয়। উদাহরণস্বরূপ, টিডিডি জোরের মধ্যে অন্ধ গভীর তুলনা পরীক্ষাগুলি অপ্রয়োজনীয় ভঙ্গুর করে তোলে। যে কারণে, আমি আরও অনেক মূল্যবান আংশিক পার্থক্য প্রবর্তন করতে চাই । এটি এই থ্রেডটিতে পূর্ববর্তী অবদানের পুনরাবৃত্তিমূলক এনালগ। এটা তোলে কী উপস্থিত না উপেক্ষা করে একটি
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] : [])),
[]);
বিডিফ অন্যান্য সম্পত্তি সহ্য করার সময় প্রত্যাশিত মানগুলি পরীক্ষা করার অনুমতি দেয়, যা আপনি স্বয়ংক্রিয় পরিদর্শন করতে চান । এটি সমস্ত ধরণের উন্নত প্রতিস্থাপনগুলি তৈরি করতে দেয়। উদাহরণ স্বরূপ:
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);
সম্পূর্ণ সমাধান ফিরে। বিডিফের সাথে একটি সম্পূর্ণ traditionalতিহ্যবাহী ডিফ নির্মাণ করা তুচ্ছ:
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"
]
পরিশেষে, মানগুলি কীভাবে পৃথক হয় তার এক ঝলক দেখতে আমরা সরাসরি ()) ডিফার্ট আউটপুটটি দেখতে চাই। তার জন্য, আমাদের বিডিফের একটি কুরুচিপূর্ণ সংস্করণ দরকার যা সিনথেটিকভাবে সঠিক পাথকে আউটপুট করে:
// 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]
এমআইটি লাইসেন্স;)