क्रिस्टोफ़ से विचार को शामिल करना और सरणियों और वस्तुओं / हैश ( 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 लेता है, जबकि संघ और चौराहे लगभग 150ms हैं। (मैक सफारी 4.0, समय के लिए जावास्क्रिप्ट तिथि का उपयोग करते हुए।)
मुझे लगता है कि कोड की 20 लाइनों के लिए सभ्य भुगतान है।