Cómo comparar dos arrays de cadenas, encontrar todas las coincidencias, cuando puede haber una oración.
Este es divertido: ¡Estoy construyendo un verificador de groserías!
Para los fines de este ejercicio, vamos a tener un array de palabras prohibidas, de esta manera:
const forbiddenWords = ['manzanas', 'naranjas', 'zanahorias azules', 'guisantes verdes y blandos'];
Luego, tendré un campo de entrada para que el usuario ingrese algo. Podría ser una combinación infinita de palabras, pero me gustaría encontrar TODAS las instancias de las palabras prohibidas y devolverlas como un array. He pensado en esta función, que me acerca mucho:
const forbiddenWords = ['manzanas', 'naranjas', 'zanahorias azules', 'guisantes verdes y blandos'];
const userInput = 'El brócoli es mi comida favorita. Odio las naranjas y las zanahorias azules';
const checkIfValidInput = () => {
// Devolverá un array que se verá así: ['El', 'brócoli', 'es', 'mi', 'comida', 'favorita', ...]
const splitWords = userInput.split(" ");
const array = [];
for (let i in forbiddenWords) {
if (splitWords.indexOf(forbiddenWords[i]) !== -1) {
array.push(forbiddenWords[i]);
}
}
return array.sort((x, y) => x - y);
};
Ejecutar lo anterior hará que el resultado del array sea ['naranjas', 'azules', 'zanahorias']
. ¿Cómo podría ampliar la función para verificar ‘zanahorias azules’ o ‘guisantes verdes y blandos’ todo en uno? Me gustaría que la función anterior devuelva ['naranjas', 'zanahorias azules']
.
¿Qué opinas?
davy.ai
Para verificar palabras prohibidas de varias palabras como
'zanahorias azules'
y'guisantes verdes blandos'
, la funcióncheckIfValidInput
puede dividir la cadena de entrada no solo por espacios, sino también por comas, puntos y otros signos de puntuación. Luego, puede unir palabras adyacentes hasta que coincida con una palabra prohibida en el arrayforbiddenWords
.Aquí tienes una versión actualizada de la función:
La función actualizada divide la
userInput
no solo por espacios (\s+
), sino también por comas, puntos y otros signos de puntuación ([,.;!?]
). Luego, recorre cada elemento deforbiddenWords
y lo divide en partes (si contiene espacios). Para cada parte deforbiddenWords
, la función verifica si hay una secuencia dewords
que la coincida exactamente. Para hacerlo, recorre todas las agrupaciones posibles de palabras en el arraywords
(usando un bucle anidado) y compara cada palabra con la parte correspondiente deforbiddenWords
. Si todas las partes coinciden, la función agrega el elemento completo deforbiddenWords
al array de salida y sale del bucle anidado, ya que solo puede haber una coincidencia. Finalmente, la función ordena el array de salida alfabéticamente utilizando el métodosort()
.