web-dev-qa-db-fra.com

utilisez lodash pour trouver une sous-chaîne dans un tableau de chaînes

J'apprends le lodash. Est-il possible d'utiliser lodash pour trouver une sous-chaîne dans un tableau de chaînes?

    var myArray = [
    'I like oranges and apples',
    'I hate banana and grapes',
    'I find mango ok',
    'another array item about fruit'
    ]

est-il possible de confirmer si le mot 'oranges' est dans mon tableau? J'ai essayé _.includes, _.some, _.indexOf mais ils ont tous échoué en regardant la chaîne complète, pas une sous-chaîne

6
John Paul Vaughan

Vous pouvez facilement construire un iteratee pour some () en utilisant les fonctions d'ordre supérieur de lodash. Par exemple:

_.some(myArray, _.unary(_.partialRight(_.includes, 'orange')));

La fonction unary () s'assure qu'un seul argument est transmis au rappel. La fonction partialRight () est utilisée pour appliquer la valeur 'orange' en tant que second argument de includes () . Le premier argument est fourni à chaque itération de some().

Cependant, cette approche ne fonctionnera pas si la sensibilité à la casse compte. Par exemple, 'Orange' renverra false. Voici comment vous pouvez gérer la sensibilité à la casse:

_.some(myArray, _.method('match', /Orange/i));

La fonction method () crée une fonction qui appellera la méthode donnée du premier argument qui lui est passé. Ici, nous comparons une expression régulière insensible à la casse.

Ou, si le respect de la casse n'a pas d'importance et que vous préférez simplement l'approche method(), cela fonctionne également pour ES2015:

_.some(myArray, _.method('includes', 'orange'));
13
Adam Boduch

Deux façons rapides de le faire - ni utilise lodash (désolé)

var found = myArray.filter(function(el){
  return el.indexOf('oranges') > -1;
}).length;

if (found) { // oranges was found }

ou comme je l'ai mentionné dans le commentaire:

var found = myArray.join(',').indexOf('oranges') > -1;
if (found) { // oranges was found }
4
James

Vous pouvez le faire en utilisant lodash, mais c'est aussi très faisable en utilisant des méthodes javascript natives:

function stringArrayContains(array, str) {
  function contains(el) {
    return (el.indexOf(str) !== -1) ? true : false;
  }

  return array.some(contains);
}

Tester la fonction ci-dessus:

var a = ['hello', 'there'];
var b = ['see', 'ya', 'later'];

stringArrayContains(a, 'ell') // true
stringArrayContains(a, 'what') // false
stringArrayContains(b, 'later') // true
stringArrayContains(b, 'hello') // false

Array.prototype.some applique une fonction que vous définissez à chaque élément d'un tableau. Cette fonction (nommée contient dans notre cas) doit retourner vrai ou faux. Lors de l'itération dans les éléments du tableau, si l'un des éléments retourne true , la méthode some renvoie true.

Personnellement, je pense qu'en général, si vous pouvez utiliser des méthodes JS natives pour des fonctions simples, il est préférable de charger une bibliothèque simplement pour faire la même chose. Lodash présente certes des avantages en termes de performances, mais ils ne sont pas nécessairement réalisés à moins que vous ne traitiez de grandes quantités de données. Juste mes deux cents.

À votre santé!

0
Isaiah Lee

Le meilleur moyen est de définir une fonction pour vérifier l'inclusion d'une sous-chaîne.

var contains = _.curry(function (substring, source) {
    return source.indexOf(substring) !== -1;
});

J'utilise _.curry ici pour obtenir une fonction curry, qui peut alors être partiellement appliquée.

_.some(myArray, contains('item'));

Vous pouvez également trouver une sous-chaîne dans une chaîne jointe.

contains('item', _.join(myArray))

UPD:

Je n'ai pas remarqué que lodash a déjà une fonction pour trouver de la valeur dans une collection.

La fonction _.includes est tout à fait la même que celle que j'ai définie ci-dessus. Cependant, comme tout dans lodash, il utilise un ordre différent pour les arguments. Dans mon exemple, je mets une source comme dernier argument d'une fonction curry, ce qui la rend utile pour la programmation de style sans points lorsque lodash attend la source comme premier argument de la même fonction.

Consultez l'intervention de Brian Lonsdorf à ce sujet https://www.youtube.com/watch?v=m3svKOdZijA

Saisissez également une chance de regarder dans ramda . Cette bibliothèque fournit un meilleur moyen de programmation fonctionnelle pratique en JavaScript.

0
Alexander Yatkevich

J'ai rencontré ce fil de discussion/question en essayant de comprendre comment faire correspondre une sous-chaîne à chaque chaîne d'un tableau et SUPPRIMER tout élément de tableau contenant cette sous-chaîne .

Alors que les réponses ci-dessus me mettent sur la bonne voie, et bien que cela ne réponde pas spécifiquement à la question initiale, ce fil n'apparaît EN PREMIER dans la recherche Google que lorsque vous essayez de comprendre comment effectuer la suppression ci-dessus d'un élément de tableau. J'ai donc pensé Je posterais une réponse ici.

J'ai fini par trouver un moyen d'utiliser la fonction _.remove de Lodash pour supprimer les chaînes de tableaux correspondantes comme suit:

        // The String (SubString) we want to match against array (for dropping purposes)
        var searchSubString = "whatever" 

        // Remove all array items that contain the text "whatever"
        _.remove(my_array, function(searchSubString) {
              return n.indexOf(searchSubString) !== -1;
            });

En principe, indexOf correspond à la position de la sous-chaîne dans la chaîne. Si la sous-chaîne est introuvable, elle renvoie -1, lorsque indexOf renvoie un nombre autre que -1 (le nombre est la position de la sous-chaîne en nombre de caractères dans la chaîne Array.) ). 

Lodash supprime cet élément de tableau par mutation de tableau et le tableau nouvellement modifié est accessible sous le même nom.

0
Necevil