Suppression d'éléments dans un tableau à L'aide de Lodash
j'ai ce tableau:
var fruits = ['Apple', 'Banana', 'Orange', 'Celery'];
et j'utilise le remove
de Lodash comme:
_.remove(fruits, function (fruit) {
return fruit === 'Apple' || 'Banana' || 'Orange';
})
le résultat est ['Apple', 'Banana', 'Orange', 'Celery']
, alors que je m'attendais à ce que ce soit ['Apple', 'Banana', 'Orange']
. Pourquoi est-ce donc?
5 réponses
parce que quand fruit
est "Celery"
, vous testez:
"Celery" === 'Apple' || 'Banana' || 'Orange'
qui évalue à
false || true || true
qui est true
.
Vous ne pouvez pas utiliser cette syntaxe. Soit le faire à la longue:
_.remove(fruits, function (fruit) {
return fruit === 'Apple' || fruit === 'Banana' || fruit === 'Orange'
});
ou de test pour la matrice de l'adhésion:
_.remove(fruits, function (fruit) {
return _.indexOf(['Apple', 'Banana', 'Orange'], fruit) !== -1
});
ceci n'est pas limité à JavaScript, et est en fait une erreur courante (par exemple ceci question )
vous pouvez utiliser la méthode _.pull
de lodash 2.0 et plus
var fruits = ['Apple', 'Banana', 'Orange', 'Celery'];
_.pull(fruits, 'Apple', 'Banana', 'Orange'); // ['Celery']
document.write(fruits);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.6.1/lodash.js"></script>
le problème n'est pas avec Lo-Dash; votre problème est avec votre conditionnel dans votre fonction de rappel. Ceci:
return fruit === 'Apple' || 'Banana' || 'Orange';
Est pas correct. Vous devez réellement comparer fruit
avec chaque chaîne de caractères:
return fruit === 'Apple' || fruit === 'Banana' || fruit === 'Orange';
ou , vous pouvez utiliser une autre fonction Lo-Dash pour la rendre un peu plus compacte:
_.remove(fruits, function (fruit) {
return _.contains(['Apple', 'Banana', 'Orange'], fruit);
})
Note: dans le les dernières versions de Lo-Dash la fonction _.contains
est dépréciée. Veuillez utiliser _.includes
Si vous souhaitez supprimer un ensemble d'éléments d'un autre ensemble, il y a des opérations destinées spécifiquement pour cela. Lodash a https://lodash.com/docs/4.17.2#difference qui prend deux paramètres de tableau A et B et retournera un autre tableau qui contient tous les éléments de A qui ne sont pas en B.
Dans votre cas, vous pourriez écrire
const fruits = ['Apple', 'Banana', 'Orange', 'Celery'];
const filteredFruits = _.difference(fruits, ['Apple', 'Banana', 'Orange']);
qui donnera ['Celery']
.
utilisez un tableau de valeurs que vous voulez comparer, et vérifiez si l'indice retourné est supérieur à -1. Cela indique que la valeur évaluée a été trouvée dans la collection.
_.remove( fruits, function ( fruit ) {
return _.indexOf( [ "Apple", "Banana", "Orange" ], fruit ) >= 0;
});
alternativement vous pouvez utiliser lo-dash _.contains
méthode pour obtenir une réponse booléenne.
le problème avec l'approche que vous avez pris était que vous ne compariez pas fruit
contre chacune de ces chaînes; au lieu de cela , la seule comparaison qui a eu lieu était fruit
contre "Apple"
, après que vous avez forcé les cordes tout seul.
les chaînes Non-vides de le contraindre à true
( !!"Banana"
), et, comme tels, truthy . Par conséquent, la condition suivante sera toujours court-circuit à "Banana" (sauf si fruit
est strictement égal à "Apple"
), en retournant true
:
return fruit === "Apple" || 'Banana' || "Orange";