Existe-t-il un moyen de map/ reduce/ filter/ etc a Seten JavaScript ou devrai-je écrire le mien?
Voici quelques Set.prototypeextensions 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 mapet d' reduceutiliser un SetJavaScript?
var s = new Set([1,2,3,4]); s.map((a) => 42);. Cela change le nombre d'éléments, ce qui mapn'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.
forEachexiste pour ce scénario, mais pourquoi non reducealors?
Setest que les ensembles ne sont pas des fonctions.