que metodo hace example ejemplo javascript set ecmascript-6 reduce

metodo - que hace map en javascript



¿Cómo mapear/reducir/filtrar un conjunto en JavaScript? (3)

La causa de la falta de map / reduce / filter en colecciones de Map / Set parece ser principalmente una preocupación conceptual. Si cada tipo de colección en Javascript especifica realmente sus propios métodos iterativos solo para permitir esto

const mySet = new Set([1,2,3]); const myMap = new Map([[1,1],[2,2],[3,3]]); mySet.map(x => x + 1); myMap.map(([k, x]) => [k, x + 1]);

en lugar de

new Set(Array.from(mySet.values(), x => x + 1)); new Map(Array.from(myMap.entries(), ([k, x]) => [k, x + 1]));

Una alternativa era especificar map / reduce / filter como parte del protocolo iterable / iterator, ya que las entries / values / keys devuelven Iterator s. Sin embargo, es concebible que no todos los iterables sean "mapeables". Otra alternativa era especificar un "protocolo de recopilación" separado para este mismo propósito.

Sin embargo, no conozco la discusión actual sobre este tema en ES.

¿Hay alguna forma de map / reduce / filter / etc. un Set en JavaScript o tendré que escribir el mío?

Aquí hay algunas extensiones sensatas de Set.prototype

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 manera mejor de lograr un map y reduce usando un Set en JavaScript?


Para resumir la discusión de los comentarios: si bien no hay razones técnicas para que el conjunto no tenga reduce , actualmente no se proporciona y solo podemos esperar que cambie en ES7.

En cuanto al map , llamarlo solo podría violar la restricción Set , por lo que su presencia aquí podría ser discutible.

Considere mapear con una función (a) => 42 : cambiará el tamaño del conjunto a 1, y esto podría o no ser lo que deseaba.

Si está de acuerdo con violar eso porque, por ejemplo, va a doblar de todos modos, puede aplicar la parte del map en cada elemento justo antes de pasarlos para reduce , aceptando así la colección intermedia ( que no es un Conjunto en este punto ) que se reducirá podría tener elementos duplicados. Esto es esencialmente equivalente a convertir a Array para hacer el procesamiento.


Una forma fácil de hacerlo es convertirlo en una matriz a través del operador de propagación ES6.

Entonces todas las funciones de la matriz están disponibles para usted.

const mySet = new Set([1,2,3,4]); [...mySet].reduce()