Comment puis-je ignorer un élément de tableau .map
?
Mon code:
var sources = images.map(function (img) {
if(img.src.split('.').pop() === "json"){ // if extension is .json
return null; // skip
}
else{
return img.src;
}
});
Cela reviendra:
["img.png", null, "img.png"]
javascript
Ismail
la source
la source
img.src
si le résultat de la division pop! = = json?undefined
serait mis dans le tableau, au lieu denull
. Pas mieux ...Réponses:
Tout d'
.filter()
abord:Si vous ne voulez pas faire cela, ce qui n'est pas déraisonnable car cela a un coût, vous pouvez utiliser le plus général
.reduce()
. Vous pouvez généralement exprimer.map()
en termes de.reduce
:peut être écrit comme
Donc, si vous devez ignorer des éléments, vous pouvez le faire facilement avec
.reduce()
:Dans cette version, le code
.filter()
du premier exemple fait partie du.reduce()
rappel. La source d'image n'est poussée sur le tableau de résultats que dans le cas où l'opération de filtrage l'aurait conservée.la source
.reduce()
et tout faire en une seule fois, mais en termes de performances, je doute que cela ferait une différence significative.null
,undefined
,NaN
etc.) , il serait bien si nous pouvions utiliser un à l' intérieur d' unmap()
comme un indicateur que cet objet mappé à rien et doit être ignoré. Je rencontre souvent des tableaux que je veux mapper à 98% (par exemple:String.split()
laisser une seule chaîne vide à la fin, ce qui ne m'importe pas). Merci pour votre réponse :).reduce()
est bien une sorte de fonction de base "faites ce que vous voulez", car vous avez un contrôle complet sur la valeur de retour. Vous pourriez être intéressé par l'excellent travail de Rich Hickey à Clojure concernant le concept de transducteurs ..map()
. Vous pouvez cependant utiliser à la.reduce()
place, donc je vais ajouter cela.Je pense que la façon la plus simple de sauter certains éléments d'un tableau est d'utiliser la méthode filter () .
En utilisant cette méthode ( ES5 ) et la syntaxe ES6, vous pouvez écrire votre code sur une seule ligne , et cela retournera ce que vous voulez :
la source
.filter()
pour quoiforEach
terminer en un seul passage au lieu de deux?O(n)
dans la mesure de la complexité et veuillez également consulter au moins ces deux articles: frontendcollisionblog.com/javascript/2015/08/15/… et coderwall.com/p/kvzbpa/don-t- use-array-foreach-use-for-place Meilleurs vœux!Depuis 2019, Array.prototype.flatMap est une bonne option.
De MDN :
la source
TLDR: Vous pouvez d'abord filtrer votre tableau, puis effectuer votre carte, mais cela nécessiterait deux passes sur le tableau (le filtre renvoie un tableau sur la carte). Étant donné que ce tableau est petit, il s'agit d'un coût de performance très faible. Vous pouvez également effectuer une simple réduction. Cependant, si vous voulez réimaginer comment cela peut être fait avec un seul passage sur le tableau (ou tout type de données), vous pouvez utiliser une idée appelée "transducteurs" rendue populaire par Rich Hickey.
Réponse:
Nous ne devrions pas exiger d'augmenter le chaînage de points et d'opérer sur le tableau,
[].map(fn1).filter(f2)...
car cette approche crée des tableaux intermédiaires en mémoire sur chaquereducing
fonction.La meilleure approche fonctionne sur la fonction de réduction réelle, il n'y a donc qu'un seul passage de données et aucun tableau supplémentaire.
La fonction de réduction est la fonction transmise
reduce
et prend un accumulateur et une entrée de la source et renvoie quelque chose qui ressemble à l'accumulateurRessources: publication de transducteurs riches en suçon
la source
Voici une solution amusante:
À utiliser avec l' opérateur de liaison :
la source
map
,filter
et lesconcat
appels.Répondre aux cas de bord sans superflu:
la source
Pourquoi ne pas simplement utiliser une boucle forEach?
Ou filtre d'utilisation encore plus simple:
la source
map
laissez-le tel qu'il est maintenant. (il y a 4 ans j'ai posé cette question, alors que je ne connaissais rien au codage)Le
.filter(Boolean)
filtrera toutes les valeurs de falsey dans un tableau donné, qui dans votre cas est lenull
.la source
Voici une méthode utilitaire (compatible ES5) qui mappe uniquement les valeurs non nulles (masque l'appel à réduire):
la source
J'utilise
.forEach
pour itérer et pousser le résultat vers leresults
tableau puis l'utiliser, avec cette solution, je ne boucle pas deux fois sur le tableaula source
Pour extrapoler sur le commentaire de Felix Kling , vous pouvez utiliser
.filter()
comme ceci:Cela supprimera les valeurs de falsey du tableau renvoyé par
.map()
Vous pouvez le simplifier davantage comme ceci:
Ou même en une ligne à l'aide d'une fonction de flèche, de la déstructuration d'objets et de l'
&&
opérateur:la source
Voici une version mise à jour du code fourni par @theprtk . C'est un peu nettoyé pour montrer la version généralisée tout en ayant un exemple.
Remarque: je voudrais ajouter ceci en tant que commentaire à son article, mais je n'ai pas encore assez de réputation
la source
Vous pouvez utiliser après votre méthode
map()
. La méthodefilter()
par exemple dans votre cas:Le filtre de méthode:
Ensuite, seuls les éléments existants sont dans le nouveau tableau
sourceFiltered
.la source