আমি কিছুটা সাধারণ-উদ্দেশ্যমূলক কৌশল গ্রহণ করি, যদিও @ কার্বারাস এবং @ ক্যাস্পার মোয়ারচের উভয় পদ্ধতির মতামতের সাথে একই রকম । আমি একটি ফাংশন তৈরি করি যা একটি প্রাকটিকে গ্রহণ করে যা দুটি বস্তু সমান কিনা তা নির্ধারণ করার জন্য (এখানে আমরা $$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);
সেরিবাসের কাছে যাওয়ার (যেমন ক্যাস্পার মোয়ার্কের পদ্ধতির মতো) এটির একটি ছোট সুবিধা রয়েছে যে এটি দ্রুত পালিয়ে যায়; যদি এটি কোনও মিল খুঁজে পায়, তবে এটি তালিকার বাকী অংশগুলি পরীক্ষা করে বিরক্ত করে না। আমার যদি কোনও curryকার্যকারিতা সহজ হয় তবে আমি এটি কিছুটা ভিন্নভাবে করতাম তবে এটি কাজ করে।
ব্যাখ্যা
একটি মন্তব্য নতুনদের জন্য আরও বিস্তারিত ব্যাখ্যা চেয়েছিল। এখানে একটি প্রচেষ্টা।
আমরা নিম্নলিখিত ফাংশনটি এখানে পাস করি makeSymmDiffFunc:
function(x, y) {
return x.value === y.value && x.display === y.display;
}
এই ফাংশনটি আমরা কীভাবে সিদ্ধান্ত নিই যে দুটি বস্তু সমান। ফিরে আসা সমস্ত ফাংশনের মতো trueবা falseএটিকে "প্রিডিকেট ফাংশন" বলা যেতে পারে তবে এটি কেবল পরিভাষা। মূল বক্তব্যটি হ'ল makeSymmDiffFuncএকটি ফাংশন দিয়ে কনফিগার করা হয়েছে যা দুটি বস্তু গ্রহণ করে এবং trueযদি আমরা সেগুলি সমান বিবেচনা না করি তবে ফিরে আসে false।
এটি ব্যবহার করে 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শিকারী ব্যবহার করে এবং এটির প্রথম তালিকার উপাদানগুলি তার দ্বিতীয়টিতে নয় returns এটি আলাদা containsফাংশন সহ আমার প্রথম পাসের চেয়ে সহজ simp
শেষ অবধি , অভ্যন্তরীণ complementফাংশনটিকে বৈশ্বিক পরিধি থেকে দূরে রাখতে মূল ফাংশনটি তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশন ( IIFE ) এ মোড়ানো হয় ।
আপডেট, কয়েক বছর পরে
এখন যে ES2015 বেশ ভাল সর্বব্যাপী হয়ে উঠেছে, আমি একই কৌশলটি অনেক কম বয়লারপ্লেটের সাথে পরামর্শ করব:
const diffBy = (pred) => (a, b) => a.filter(x => !b.some(y => pred(x, y)))
const makeSymmDiffFunc = (pred) => (a, b) => diffBy(pred)(a, b).concat(diffBy(pred)(b, a))
const myDiff = makeSymmDiffFunc((x, y) => x.value === y.value && x.display === y.display)
const result = myDiff(a, b)