¿Hay alguna forma de map/ reduce/ filter/ etc a Seten JavaScript o tendré que escribir la mía?
Aquí hay algunas Set.prototypeextensiones sensatas
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;
};
Tomemos un pequeño set
let s = new Set([1,2,3,4]);
Y algunas estúpidas funciones
const times10 = x => x * 10;
const add = (x,y) => x + y;
const even = x => x % 2 === 0;
Y mira cómo funcionan
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
¿No es lindo? Sí, yo también lo creo. Compare eso con el uso del iterador feo
// puke
let newSet = new Set();
for (let v in s) {
newSet.add(times10(v));
}
Y
// barf
let sum = 0;
for (let v in s) {
sum = sum + v;
}
¿Hay alguna forma mejor de lograr mapy reduceusar un SetJavaScript?
var s = new Set([1,2,3,4]); s.map((a) => 42);. Cambia el número de elementos, que mapnormalmente no se supone que debe hacer. Peor aún si solo está comparando partes de los objetos guardados, porque técnicamente no se especifica cuál obtendrá.
forEachexiste para ese escenario, pero ¿por qué no reduceentonces?
Setes que los Conjuntos no son Functores.