Estoy tratando de escribir un código javascript que me permita extraer qué palabras (dadas como una lista) contienen 1 o más caracteres en una lista dada de palabras.
function filterWords(words, letters) { var myArrayOfLetters = Array.from(letters) var output; for(var i = 0; i<myArrayOfLetters.length; ++i) { output = words.filter(word => word.includes(myArrayOfLetters[i])) } return output; }Este es el código que tengo hasta ahora pero no funciona.
Este es un ejemplo de la entrada y la salida requerida:
words = ['the','dog','got','a','bone'] letters = 'ae' output = ['the','a','bone']Como puede ver, la salida contiene todas las palabras que tienen 'a' o 'e' en ellas o ambas.
¿Cómo haría para resolver este problema?
Estás en el camino correcto, pero tienes tus bucles al revés. Desea usar el filter como bucle externo y el bucle sobre la matriz de letras como bucle interno , ya que desea saber si una palabra tiene alguna de esas letras. El ciclo interno puede ser una llamada a some método en lugar de un ciclo explícito:
function filterWords(words, letters) { const myArrayOfLetters = Array.from(letters); const output = words.filter((word) => myArrayOfLetters.some((letter) => word.includes(letter)) ); return output; } some devuelve true si la devolución de llamada alguna vez devuelve true (o cualquier valor verdadero), o false si la devolución de llamada nunca lo hace.
Ejemplo en vivo:
function filterWords(words, letters) { const myArrayOfLetters = Array.from(letters); const output = words.filter((word) => myArrayOfLetters.some((letter) => word.includes(letter))); return output; } const words = ["the", "dog", "got", "a", "bone"]; const letters = "ae"; console.log(filterWords(words, letters)); Aquí hay un ejemplo con una palabra que tiene tanto a como e ; tenga en cuenta que solo se incluye una vez:
function filterWords(words, letters) { const myArrayOfLetters = Array.from(letters); const output = words.filter((word) => myArrayOfLetters.some((letter) => word.includes(letter))); return output; } const words = ["the", "dog", "got", "a", "really", "nice", "bone"]; const letters = "ae"; console.log(filterWords(words, letters));Simplemente puede lograrlo con la ayuda de Array.filter() junto con el método Array.some() .
Demostración en vivo :
let words = ['the', 'dog', 'got', 'a', 'bone']; const letters = 'ae'; const splittedLetters = letters.split(''); const res = words.filter(item => { return splittedLetters.some(word => item.includes(word)); }); console.log(res);let words = ['javascript', 'java', 'ruby', 'python', 'php']; let filterWords =(words, chars) => { return words.filter(word => word.split('').some(char => chars.includes(char))); } console.log(filterWords(words, 'pa')); //['JavaScript', 'Java', 'Python', 'PHP']