Gibt es einen Weg zu map
/reduce
/filter
/etc eine Set
in JavaScript oder muss ich meine eigene schreiben?Wie wird ein Set in JavaScript gemappt/reduziert/gefiltert?
Hier einige vernünftige Set.prototype
Erweiterungen
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;
};
Werfen wir einen kleinen Satz
let s = new Set([1,2,3,4]);
Und einige dumme kleine Funktionen
const times10 = x => x * 10;
const add = (x,y) => x + y;
const even = x => x % 2 === 0;
und sehen, wie sie funktionieren
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
Isn't that nice ? Yeah, I think so too. Compare that to the ugly iterator usage
// puke
let newSet = new Set();
for (let v in s) {
newSet.add(times10(v));
}
Und
// barf
let sum = 0;
for (let v in s) {
sum = sum + v;
}
Gibt es eine bessere Art und Weise map
und reduce
mit einem Set
in JavaScript zu erreichen?
Das Problem mit dem Map-Reduzieren eines 'Set' ist, dass Sets keine Functors sind. –
@BartekBanachewicz Ja, das ist ein Problem ... oder? – naomik
Nun, betrachte 'var s = new Set ([1,2,3,4]); s.map ((a) => 42); '. Es ändert die Anzahl der Elemente, die "map" normalerweise nicht tun soll. Noch schlimmer, wenn Sie nur Teile der aufbewahrten Objekte vergleichen, denn dann ist technisch nicht bekannt, welches Sie erhalten werden. –