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?

20
demandé sur bard 2015-01-20 05:15:08

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 )

49
répondu Amadan 2017-05-23 11:54:48

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>
28
répondu gustavogelf 2016-03-14 15:06:19

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

8
répondu ncksllvn 2016-10-24 14:40:39

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'] .

8
répondu Mouscellaneous 2016-11-18 09:08:50

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";
2
répondu Sampson 2015-01-20 02:26:54