क्या जावास्क्रिप्ट में 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एंग के साथ समस्या यह है कि सेट्स फ़ंक्टर नहीं हैं।