¿Hay alguna forma de map
/ reduce
/ filter
/ etc a Set
en JavaScript o tendré que escribir la mía?
Aquí hay algunas Set.prototype
extensiones 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 map
y reduce
usar un Set
JavaScript?
var s = new Set([1,2,3,4]); s.map((a) => 42);
. Cambia el número de elementos, que map
normalmente 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á.
forEach
existe para ese escenario, pero ¿por qué no reduce
entonces?
Set
es que los Conjuntos no son Functores.