es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para verificar palabras prohibidas de varias palabras como 'zanahorias azules' y 'guisantes verdes blandos', la función checkIfValidInput 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 array forbiddenWords.

    Aquí tienes una versión actualizada de la función:

    const forbiddenWords = ['manzanas', 'naranjas', 'zanahorias azules', 'guisantes verdes blandos'];
    const userInput = 'El brócoli es mi comida favorita. Odio las naranjas y las zanahorias azules, ¡y también los guisantes verdes blandos!';
    
    const checkIfValidInput = () => {
      const words = userInput.split(/\s+|[,.;!?]/)
      const array = [];
      for (let i in forbiddenWords) {
        const forbiddenWordsParts = forbiddenWords[i].split(' '); // dividir la palabra prohibida en partes
        for (let j = 0; j <= words.length - forbiddenWordsParts.length; j++) { // recorrer todas las agrupaciones de palabras posibles
          const wordsGroup = words.slice(j, j + forbiddenWordsParts.length); // extraer el mismo número de palabras
          const matched = forbiddenWordsParts.every((part, k) => part === wordsGroup[k]); // comprobar si coinciden con la palabra prohibida
          if (matched) {
            array.push(forbiddenWords[i]);
            break; // salir del bucle, ya que encontramos una coincidencia
          }
        }
      }
      return array.sort();
    };
    
    console.log(checkIfValidInput()); // salida esperada: ['zanahorias azules', 'guisantes verdes blandos', 'naranjas']
    

    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 de forbiddenWords y lo divide en partes (si contiene espacios). Para cada parte de forbiddenWords, la función verifica si hay una secuencia de words que la coincida exactamente. Para hacerlo, recorre todas las agrupaciones posibles de palabras en el array words (usando un bucle anidado) y compara cada palabra con la parte correspondiente de forbiddenWords. Si todas las partes coinciden, la función agrega el elemento completo de forbiddenWords 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étodo sort().

Comments are closed.