Gibt es eine Möglichkeit zu map/ reduce/ filter/ etc a Setin JavaScript oder muss ich meine eigene schreiben?
Hier sind einige sinnvolle Set.prototypeErweiterungen
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 mapund zu reduceverwenden Set?
var s = new Set([1,2,3,4]); s.map((a) => 42);. Es ändert die Anzahl der Elemente, was mapnormalerweise nicht der Fall ist. Noch schlimmer, wenn Sie nur Teile der aufbewahrten Objekte vergleichen, denn technisch ist nicht angegeben, welche Sie erhalten.
forEachfür dieses Szenario, aber warum reducedann nicht?
Setist, dass Sets keine Funktoren sind.