क्या जावास्क्रिप्ट में map
/ reduce
/ filter
/ आदि के लिए कोई रास्ता है Set
या मुझे अपना खुद का लिखना होगा?
यहाँ कुछ समझदार Set.prototype
एक्सटेंशन हैं
Set.prototype.map = function map(f) {
var newSet = new Set();
for (var v of this.values()) newSet.add(f(v));
return newSet;
};
Set.prototype.reduce = function(f,initial) {
var result = initial;
for (var v of this) result = f(result, v);
return result;
};
Set.prototype.filter = function filter(f) {
var newSet = new Set();
for (var v of this) if(f(v)) newSet.add(v);
return newSet;
};
Set.prototype.every = function every(f) {
for (var v of this) if (!f(v)) return false;
return true;
};
Set.prototype.some = function some(f) {
for (var v of this) if (f(v)) return true;
return false;
};
चलो थोड़ा सा सेट लेते हैं
let s = new Set([1,2,3,4]);
और कुछ बेवकूफ छोटे कार्य करता है
const times10 = x => x * 10;
const add = (x,y) => x + y;
const even = x => x % 2 === 0;
और देखें कि वे कैसे काम करते हैं
s.map(times10); //=> Set {10,20,30,40}
s.reduce(add, 0); //=> 10
s.filter(even); //=> Set {2,4}
s.every(even); //=> false
s.some(even); //=> true
क्या यह अच्छा नहीं है? हाँ, मैं भी ऐसा ही सोचता हूँ। तुलना करें कि बदसूरत पुनरावृत्ति उपयोग के लिए
// puke
let newSet = new Set();
for (let v in s) {
newSet.add(times10(v));
}
तथा
// barf
let sum = 0;
for (let v in s) {
sum = sum + v;
}
क्या जावास्क्रिप्ट में पूरा करने map
और reduce
उपयोग करने का कोई बेहतर तरीका है Set
?
var s = new Set([1,2,3,4]); s.map((a) => 42);
। यह तत्वों की संख्या में परिवर्तन करता है, जो map
आमतौर पर करने वाला नहीं है। इससे भी बदतर अगर आप केवल रखी गई वस्तुओं के हिस्सों की तुलना कर रहे हैं, क्योंकि तब तकनीकी रूप से यह अनिर्दिष्ट है कि आपको कौन सा मिलेगा।
forEach
उस परिदृश्य के लिए मौजूद है, लेकिन reduce
तब क्यों नहीं ?
Set
एंग के साथ समस्या यह है कि सेट्स फ़ंक्टर नहीं हैं।