2
votes

javascript: vérifiez quelle entrée de tableau est incluse dans la chaîne

Je vérifie si une chaîne contient une ou plusieurs entrées d'un tableau, en utilisant .some () et .includes () comme vous pouvez le voir ci-dessous.

Si la chaîne comprend une ou plusieurs entrées du tableau, J'aimerais savoir lequel (s). Je n'ai pas encore trouvé de moyen d'y parvenir.

Voici mon code:

var hobby = ["sport","art","music"];
var message = "I love sport!";

if(hobby.some(el => message.includes(el))){
    console.log("a hobby is included");

     // tell me which hobby or hobbies here
}


0 commentaires

3 Réponses :


2
votes

Utilisez .filter au lieu de .some:

var hobby = ["sport", "art", "music"];
const checkMessage = (message) => {
  const hobbyIndicies = hobby.reduce((a, word, i) => {
    if (message.includes(word)) {
      a.push(i);
    }
    return a;
  }, []);
  if (hobbyIndicies.length !== 0) {
    console.log('Looks like you like indicies ' + hobbyIndicies.join(','));
  } else {
    console.log('No matching hobbies found');
  }
};

checkMessage("I love sport!");
checkMessage("foo bar");
checkMessage("music and art");

Si vous vouliez les indices correspondants, utilisez .reduce:

var hobby = ["sport", "art", "music"];
const checkMessage = (message) => {
  const hobbies = hobby.filter(word => message.includes(word));
  if (hobbies.length !== 0) {
    console.log('Looks like you like ' + hobbies.join(','));
  } else {
    console.log('No matching hobbies found');
  }
};

checkMessage("I love sport!");
checkMessage("foo bar");
checkMessage("music and art");


2 commentaires

Intéressant, merci! Juste curieux, au lieu d'utiliser join (), existe-t-il un moyen simple d'obtenir les index des mots correspondants à partir du premier tableau? Par exemple ici "0" pour le sport dans le tableau "hobby"?


Utilisez plutôt .reduce , voir edit, même si c'est assez bizarre, je préfère fortement .filter



2
votes

La méthode .filter () peut être utilisée à la place de .some () pour acquérir une liste d'éléments qui sont inclus dans le message code> chaîne. Cela peut à son tour être utilisé pour afficher les loisirs dans le message.

La logique impliquerait une vérification supplémentaire pour s'assurer que la longueur de la liste filtrée n'est pas vide avant d'enregistrer le résultat dans la console:

var hobby = ["sport", "art", "music"];
var message = "I love sport!";

// Use .filter instead of .some
var result = hobby.filter(el => message.includes(el));

// If result not empty, log the result to console
if (result.length > 0) {
  console.log("a hobby or hobbies are included:", result);

  // To find matching indicies
  const matchingIndicies = hobby
    .map((str, index) => ({ str, index }))
    .filter((item) => message.includes(item.str))
    .map((item) => (item.str + ' at index ' + item.index));
 
  console.log("matching indicies:", matchingIndicies)
  // tell me which hobby or hobbies here
}


0 commentaires

0
votes

Je préfère une simple boucle forEach comme celle-ci:

var hobby = ["sport", "art", "music"];
var message = "I love sport!";
var idxs = []
var vals =[]
hobby.forEach(function(val, idx){
  if (message.includes(val))
  {
      idxs.push(idx);
      vals.push(val)
  }
});

if (vals.length !== 0) {
  console.log('You like ' + vals.join(','));
  console.log('Your hobby indices: ' + idxs.join(','));
} else {
  console.log('You Like Nothing!!');
}


0 commentaires