Existe-t-il un moyen de map
/ reduce
/ filter
/ etc a Set
en JavaScript ou devrai-je écrire le mien?
Voici quelques Set.prototype
extensions sensibles
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;
};
Prenons un petit ensemble
let s = new Set([1,2,3,4]);
Et quelques petites fonctions stupides
const times10 = x => x * 10;
const add = (x,y) => x + y;
const even = x => x % 2 === 0;
Et voyez comment ils fonctionnent
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
N'est-ce pas sympa? Ouais, je le pense aussi. Comparez cela à l'utilisation laide de l'itérateur
// puke
let newSet = new Set();
for (let v in s) {
newSet.add(times10(v));
}
Et
// barf
let sum = 0;
for (let v in s) {
sum = sum + v;
}
Existe-t-il un meilleur moyen d'accomplir map
et d' reduce
utiliser un Set
JavaScript?
var s = new Set([1,2,3,4]); s.map((a) => 42);
. Cela change le nombre d'éléments, ce qui map
n'est généralement pas censé faire. Pire encore si vous ne comparez que des parties des objets conservés, car techniquement, il n'est pas spécifié lequel vous obtiendrez.
forEach
existe pour ce scénario, mais pourquoi non reduce
alors?
Set
est que les ensembles ne sont pas des fonctions.