ক্রিস্টোফের কাছ থেকে ধারণাটি অন্তর্ভুক্ত করে এবং অ্যারে এবং অবজেক্টস / হ্যাশগুলিতে ( eachএবং বন্ধুরা) বেশ কয়েকটি অ-মানক পুনরাবৃত্তি পদ্ধতি গ্রহণ করে , আমরা প্রায় 20 টি লাইনে রৈখিক সময়ের মধ্যে পার্থক্য, ইউনিয়ন এবং ছেদটি পেতে পারি:
var setOPs = {
minusAB : function (a, b) {
var h = {};
b.each(function (v) { h[v] = true; });
return a.filter(function (v) { return !h.hasOwnProperty(v); });
},
unionAB : function (a, b) {
var h = {}, f = function (v) { h[v] = true; };
a.each(f);
b.each(f);
return myUtils.keys(h);
},
intersectAB : function (a, b) {
var h = {};
a.each(function (v) { h[v] = 1; });
b.each(function (v) { h[v] = (h[v] || 0) + 1; });
var fnSel = function (v, count) { return count > 1; };
var fnVal = function (v, c) { return v; };
return myUtils.select(h, fnSel, fnVal);
}
};
এটি ধরে নেয় eachএবং filterঅ্যারেগুলির জন্য সংজ্ঞায়িত করা হয় এবং আমাদের দুটি ইউটিলিটি পদ্ধতি রয়েছে:
myUtils.keys(hash): হ্যাশগুলির কীগুলির সাহায্যে একটি অ্যারে প্রদান করে
myUtils.select(hash, fnSelector,
fnEvaluator): fnEvaluator
কী / মান জোড়গুলির জন্য কল করার ফলাফলগুলির সাথে একটি অ্যারে প্রদান করে যার জন্য
fnSelectorসত্যটি প্রত্যাবর্তিত হয়।
select()ঢিলেঢালাভাবে প্রচলিত পাতার মর্মর দ্বারা অনুপ্রাণিত হয়, এবং নিছক হয় filter()এবং map()একই ব্যক্তির মধ্যে সমন্বিত। (এগুলি সংজ্ঞায়িত করা ভাল হবেObject.prototype , তবে এটি করার ফলে jQuery দিয়ে সর্বনাশ হয়েছে, তাই আমি স্থির ইউটিলিটি পদ্ধতিতে স্থির হয়েছি))
পারফরম্যান্স: পরীক্ষা দিয়ে
var a = [], b = [];
for (var i = 100000; i--; ) {
if (i % 2 !== 0) a.push(i);
if (i % 3 !== 0) b.push(i);
}
50,000 এবং 66,666 উপাদান সহ দুটি সেট দেয়। এই মানগুলির সাথে এবি প্রায় 75ms গ্রহণ করে, যখন ইউনিয়ন এবং ছেদটি প্রতিটি 150 মিমি হয়। (ম্যাক সাফারি 4.0, সময়সীমার জন্য জাভাস্ক্রিপ্ট তারিখ ব্যবহার করে))
আমি মনে করি যে 20 লাইনের কোডের জন্য এটি শালীন বেতন।