Gibt es eine Möglichkeit zu map
/ reduce
/ filter
/ etc a Set
in JavaScript oder muss ich meine eigene schreiben?
Hier sind einige sinnvolle 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;
};
Nehmen wir ein kleines Set
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
Ist das nicht schön Ja, das denke ich auch. Vergleichen Sie das mit der hässlichen Iterator-Verwendung
// 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 Möglichkeit, eine in JavaScript zu erreichen map
und zu reduce
verwenden Set
?
var s = new Set([1,2,3,4]); s.map((a) => 42);
. Es ändert die Anzahl der Elemente, was map
normalerweise nicht der Fall ist. Noch schlimmer, wenn Sie nur Teile der aufbewahrten Objekte vergleichen, denn technisch ist nicht angegeben, welche Sie erhalten.
forEach
für dieses Szenario, aber warum reduce
dann nicht?
Set
ist, dass Sets keine Funktoren sind.