TLDR : Utiliser map
(retour undefined
le cas échéant) et entonces filter
.
Tout d'abord, je pense qu'une fonction map + filter est utile car vous ne voulez pas répéter un calcul dans les deux. Swift appelait à l'origine cette fonction flatMap
mais l'a ensuite renommé en compactMap
.
Par exemple, si nous ne disposons pas d'un compactMap
nous pourrions nous retrouver avec computation
défini deux fois :
let array = [1, 2, 3, 4, 5, 6, 7, 8];
let mapped = array
.filter(x => {
let computation = x / 2 + 1;
let isIncluded = computation % 2 === 0;
return isIncluded;
})
.map(x => {
let computation = x / 2 + 1;
return `${x} is included because ${computation} is even`
})
// Output: [2 is included because 2 is even, 6 is included because 4 is even]
Así compactMap
serait utile pour réduire la duplication du code.
Une façon très simple de faire quelque chose de similaire à compactMap
est de :
- Carte sur les valeurs réelles ou
undefined
.
- Filtrer tous les
undefined
valeurs.
Cela suppose bien sûr que vous n'ayez jamais besoin de renvoyer des valeurs indéfinies dans le cadre de votre fonction de carte originale.
Ejemplo:
let array = [1, 2, 3, 4, 5, 6, 7, 8];
let mapped = array
.map(x => {
let computation = x / 2 + 1;
let isIncluded = computation % 2 === 0;
if (isIncluded) {
return `${x} is included because ${computation} is even`
} else {
return undefined
}
})
.filter(x => typeof x !== "undefined")