Javascript - Encontrar palabras parecidas en un Array()

Tengo el siguiente Array()

palabras = ["anatomia","ana","angie","anatómico","anatómica","análisis","analogía","analizar","anabólico"];

Ahora bien, en HTML tengo:



Para capturar el value del input tengo:

$(".p").on('input', function(event) {
    if ($.inArray($(this).val(), palabras);) {
        console.log("Reached!!");
    }else{
        console.log("Waiting / You're typing...");
    }
});

Quisiera poder capturar la palabra sin necesidad de escribirla completa. introducir la descripción de la imagen aquí

Y pues lo que tengo solo captura si la palabra está completa en el input :(

6
задан 06.12.2016, 17:02
3 ответа

Способ решать эту проблему," отлаживая " (normalizar) слова, а именно, снимать символы с акцентом.

Шагов, Которые нужно реализовывать:

  1. Нормализовать договоренность слов.
  2. Упорядочивать alfabГ©ticamente нормализованную договоренность.
  3. Обнаруживать ввод стоимости и нормализовать того же самого.
  4. Искать стоимость, введенную в компьютер в договоренности нормализованных слов.

AquГ - оставил одну тебе возможной soluciГіn.

$(function(){
  function normalizeWord(word) {
    var letters = [{
        search: 'áäàãâ',
        replace: 'a'
      }, {
        search: 'éëèê',
        replace: 'e'
      }, {
        search: 'íïìî',
        replace: 'i'
      }, {
       search: 'óöòõô',
       replace: 'o'
      }, {
        search: 'úüùû',
        replace: 'u'
      }, {
        search: 'ñ',
        replace: 'n'
      }, {
        search: 'ç',
        replace: 'c'
      }],
      normal;
    
    // Convertimos la palabra a minusculas
    word = word.toLowerCase();
    normal = word;

    // Por cada "letra"
    $.each(letters, function(idx, letter) {
      var re = new RegExp('[' + letter.search + ']', 'g');
      // Reemplazamos el caracter acentuado
      normal = normal.replace(re, letter.replace);
    });
  
    // Devolvemos un objeto con la palabra original y la normalizada
    return {
      original: word,
      normal: normal
    };
  }
  
  function normalizeWords(words) {
    var response = [];
  
    // Por cada palabra
    $.each(words, function(idx, word) {
      // Obtenemos la palabra normlalizada
      response.push(normalizeWord(word));
    });
  
    return response;
  }
  
  function sortNormalizedWords(a, b) {
    if (a.normal > b.normal) {
      return 1;
    }
    if (a.normal < b.normal) {
      return -1;
    }
    return 0;
  }
  
  function sortShortWords(a, b) {
    if (a.length > b.length) {
      return 1;
    }
    if (a.length < b.length) {
      return -1;
    }
    return 0;
  }
  
  //

   var palabras = ["anatomia","Ana","angie","anatómico","anatómica","análisis","analogía","analizar","anabólico","Analuz", "tu", "tú", "túnel"],
       // Obtenemos la palabras normalizadas (sin caracteres acentuados)
       words = normalizeWords(palabras);
  
  // Ordenamos el arreglo de la A a la Z
  words.sort(sortNormalizedWords);
  
  $( "#entrada").on('input', function() {
    var key = this.value,
        posibles = [],
        lucky = false;
    
    // Normalizamos el valor ingresado
    key = normalizeWord(key);
    
    // Por cada palabra
    $.each(words, function(idx, word) {
      // Validamos que contenga el valor ingresado
      if (word.normal.indexOf(key.normal) !== -1) {
        posibles.push(word.original);
        
        // Si es exactamente la palabra buscada
        if (key.original === word.original) {
          lucky = word.original;
        }
        // Si es igual a la palabras normalizada
        else if (!lucky && key.normal === word.normal) {
          lucky = word.normal;
        }
      }
    });
    
    // Imprimimos todas las palabras que contienen el valor ingresado
    $('#posibles').val(posibles.join(','));
    
    // Si no encontramos la pablabra exacta, 
    // ordenamos el arreglo de posibles
    // y devolvemos la primera
    if (!lucky) {
      lucky = posibles.sort(sortShortWords)[0];
     }
    $('#acertada').val(lucky);
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Entrada:
<input type="text" id="entrada"><br>
Posibles:
<input type="text" id="posibles" readonly><br>
Mas acertada:
<input type="text" id="acertada" readonly><br>
4
ответ дан 24.11.2019, 12:15
  • 1
    có я говорю, что он работает впечатляющей формы. Мой вопрос, - если он хотел, что как má ximo было 3 подсказки, и что каждая подсказка esté в div, qué форма podrí чтобы это делать? –  Máxima Alekz 07.12.2016, 02:15
  • 2
    Уже conseguí :) Не беспокойся –  Máxima Alekz 07.12.2016, 03:17
  • 3
    Относительно сделанных ревизий, есть проблемы используя " tú " и " tu" в Array () Слов –  Máxima Alekz 13.12.2016, 16:31
  • 4
    Если ты пишешь в главном неударе в лунку, má s преуспевшая ты , когда deberí чтобы быть также –  Máxima Alekz 13.12.2016, 16:58
  • 5
    Пишет , и verá s, что só arrojará ты –  Máxima Alekz 14.12.2016, 00:23

palabras = ["anatomia","ana","angie","anatómico","anatómica","análisis","analogía","analizar","anabólico"];

//Autocomplete funciona para completar palabras
$( ".p" ).autocomplete({ 
    source: palabras,
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
  <script src="https://code.jquery.com/ui/1.11.2/jquery-ui.min.js"></script>
  <link rel="stylesheet" href="https://code.jquery.com/ui/1.11.2/themes/black-tie/jquery-ui.css" />

<!-- tu input -->
<input type="text" name="palabra" class="p">

Совсем documentaciГіn в Автозавершил

4
ответ дан 24.11.2019, 12:15
  • 1
    +1 из-за того, что - первая попытка ответа. Aú n я не протестировал твой có я говорю, haré má s поздно. –  Máxima Alekz 06.12.2016, 17:51

Этот вопрос заинтересовал меня достаточно поэтому razó n - diseГ±ado простой автомобиль - completador и я надеюсь, что мой ответ полезный для твоей проблемы, Давайте Видеть код:

$(document).ready(function () {

  var $input = $('.in');
  var $proof = $('.proof');

  // Tu arreglo de palabras
  var arr = [
    'ana',
    'angie',
    'anatomica',
    'analogo',
    'analizar',
    'analisis',
    'analogia',
    'anatomia',
  ];

  $input.on('input', handler);

  // Callback
  function handler (e) {

    $proof.empty();
    var data = $(this).val();

    /* Primero que todo ... */
    if (data !== '') {

      /**
       * La palabra justamente debe ser igual a alguna del arreglo.
       * Si no se debera encontrar alguna coincidencia con la palabra
       * ingresada.
       */
      if (arr.indexOf(data) !== -1) {
        $proof.append('la palabra es: ' + arr[arr.indexOf(data)]);
      } else {

        /**
         * Arreglo `arrDiffLength` almacenara la diferencia
         * entre la/s palabra/s del arreglo 'arr' con la palabra
         * ingresada por ejemplo:
         *    'analisis'.length - 'ana'.length === 5
         */
        var arrDiffLength = [];

        /**
         * Arreglo `arrShortWord` almacenara la/s palabra/s ajustadas
         * al tamaño de la palabra ingresada, es decir, 'analogo' ajustada
         * al tamaño de 'anali' seria 'analo' de esta forma se logra encontrar
         * si la palabra coincide parcialmente con una palabra del arreglo.
         */
        var arrShortWord = [];

        // Variable a utilizar para concatenar las palabras ajustadas.
        var temp = '';

        // Iteracion para encontrar la/s diferencia/s.
        for (var i = 0; i < arr.length; i++) {
          arrDiffLength.push(arr[i].length - data.length);
        }

        // Iteracion para encontrar las palabras ajustadas.
        for (var i = 0; i < arr.length; i++) {
          for (var j = 0; j < data.length; j++) {
            temp += arr[i][j];
          }
          arrShortWord.push(temp);
          temp = '';
        }

        /**
         * Valor minimo del arreglo `arrDiffLength`.
         * Se utilizara para encontrar la palabra mas corta
         * que coincida con la palabra ingresada.
         */
        var minVal = Math.min.apply(null, arrDiffLength);

        // Indice del valor minimo en el arreglo `arrShortWord`
        var indexOfMinVal = arrDiffLength.indexOf(minVal);

        /**
         * Condicional para verificar que almenos una o mas
         * coincidencias existen entre el arreglo `arrShortWord`
         * y la palabra ingresada.
         */
        if (arrShortWord.indexOf(data) !== -1) {
          /**
           * Se busca la palabra que coincida con la palabra ingresada
           * y que sea la mas pequeña.
           * Si no, se itera para encontrar otras coincidencias.
           */
          if (arrShortWord[indexOfMinVal] === data) {
            $proof.append('La palabra es: ', arr[indexOfMinVal]);
          } else {
            for (var i = 0; i < arr.length; i++) {
              if (arrShortWord[i] === data) {
                $proof.append('La palabra es: ', arr[i]);
                break;
              }
            }
          }
        } else {
          $proof.append('La palabra no se encuentra.');
        }
      }
    }

    e.preventDefault();
  }
});
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Auto comletador</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
  </head>
  <body>
    <!-- Simple input -->
    <input class="in" type="text">

    <!-- Aqui se mostrara la palabra acertada -->
    <div class="proof"></div>
  </body>
</html>

Это diseГ±ado segú n твои критерии в вопросе и я прокомментировал код для того, чтобы ты смог понимать это быстро, надеюсь, что он помогает Привет!.

1
ответ дан 24.11.2019, 12:15

Теги

Похожие вопросы