Логика Jquery для сортировки выбранных опций по количеству совпадений слов - PullRequest
1 голос
/ 28 июля 2011

Я хочу что-то похожее на сортировку данных Mysql, но в jquery.У меня есть вход и тег выбора, например:

enter image description here

Я хочу, чтобы параметры выбора были отфильтрованы и отсортированы в зависимости от значения входного текста.

  • Фильтрация Логика ИЛИ, применяемая к вводимому тексту, и все сохраняемые параметры, которые содержат хотя бы одно слово
  • Сортировка / Группировка , затем сортировкаостальные параметры по количеству совпадений, так что параметры, содержащие все слова, как во входных данных, отображаются вверху, за ними следуют варианты с одним словом и т. д.Следующее является лишь иллюстрацией и может быть неточным -

enter image description here

Я закончил с логикой фильтрующей части.Теперь начинается сортировка, и я не уверен, как это сделать.

В качестве примера, скажем, во входном тексте размещена строка из 5 слов.Я не знаю, есть ли что-то в jQuery, похожее на порядок в Mysql, по которому можно вернуть отсортированные параметры.Итак, моя логика такая (псевдокод) -

var numberOfWords;
sortedOptions = new Array();
for(cnt=numberOfWords; cnt>0; cnt --)
{
    find options containing exactly those many words
    append them to array sortedOptions
}

Теперь рассмотрим случай, когда numberOfWords = 5 и cnt = 3.Есть много возможных комбинаций из 3 слов, которые мне нужно проверить, чтобы подготовить варианты с совпадением 3 слов.Это хорошо, но как насчет временной сложности кода, когда количество слов увеличивается?Есть ли лучший оптимизированный способ?

Обратите внимание - Эту проверку, возможно, необходимо выполнить, пока пользователь печатает (при каждом нажатии клавиши), а я не могу подключиться к базе данных бэкэнда, поэтомучасто.Я еще не нашел готовый плагин для той же цели.Пожалуйста, проверьте мой предыдущий вопрос Любой плагин, совместимый с jquery 1.3, для фильтрации выпадающего списка с использованием пользовательского ввода текста и группировки по количеству строк ввода, соответствующих , относительно этого.Если вы знаете какой-либо плагин, который может решить проблему, пожалуйста, напишите туда.Но все равно с нетерпением жду решения этой проблемы.

Спасибо

Ответы [ 2 ]

3 голосов
/ 28 июля 2011

Что-то вроде этого (не полностью работает):

$(function(){
  var $select = $('#mySelectBox'), nonMatches = [], $text = $('#myTextBox').keyup(function(){
      // find all the words
      var words = $text.val().split(' '), options = []
    // nonMatches is an array of <option>s from the prev search that didn't match
    // we put them back in the <select>
    for (var i in nonMatches)
      $select.append(nonMatches[i])
    nonMatches = []
    // and clear all the old labels like "1 word match"
    $select.find('optgroup').each(function(){
      var $this = $(this)
      $this.replaceWith($this.html())
    })
    // if the textbox is blank, dont need to search
    if (!words.length)
      return
    // loop thru each <option>
    $select.find('option').each(function(){
      var wordCount = 0, $this = $(this), html = ' ' + $this.html().toLowerCase() + ' '
      // loop thru each word and check if the <select> contains that word
      for (var i in words) {
        if (html.indexOf(' ' + words[i].toLowerCase() + ' ') > -1)
          wordCount++
      }
      // if this <option> doesn't have any of the words, save and remove it
      if (wordCount == 0)
        nonMatches.push($this.remove())
      else {
        // otherwise, save it to be sorted
        if (!options[wordCount])
          options[wordCount] = []
        options[wordCount].push($this.remove())
      }
    })
    // the options array holds all the <option>s that match; we need to sort it
    keys = [], sortedOptions = []
    for (var i in options) {
      keys.push(i)
    }
    keys.sort()
    keys.reverse()
    for (var i in keys)
      sortedOptions[keys[i]] = options[keys[i]]
    for (var i in sortedOptions) {
      // put the matches in the <select>
      $select.append('<optgroup label="' + (i == words.length ? 'All' : i) + ' word match">')
      for (var j in sortedOptions[i]) {
        $select.append(sortedOptions[i][j])
      }
      $select.append('</optgroup')
    }
  })
})
0 голосов
/ 28 июля 2011

Вы можете отфильтровать результат, используя фильтр массива.Это даст вам массив подэлементов.

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/filter

function isBigEnough(element, index, array) {
  return (element >= 10);
}
var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
// filtered is [12, 130, 44]

Вы можете отсортировать по длине, используя функцию сортировки

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort

var numbers = ["aa", "b"];

numbers.sort(function(a, b) {
   return a.length - b.length;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...