Как отсортировать массив строк по поисковым ключевым словам? - PullRequest
0 голосов
/ 04 июня 2018

У меня есть массив строк.Мне нужно отсортировать массив на основе массива ключевых слов.Строка, содержащая макс.количество ключевых слов должно стоять на первом месте и так далее.Кроме того, строка, которая содержит макс.нет.поисковых ключевых слов должен идти первым, чем количество вхождений одного и того же поискового ключевого слова.testArray следует игнорировать регистр searchTerms.Если возможно, вы можете игнорировать строки, которые не содержат никаких поисковых слов в массиве результатов.

var testArray = [
    "I am",
    "I am wrong and I don't know",
    "I am right and I know",
    "I don't know",
    "I do know"
  ],
  searchTerms = ["I", "right","know"];

$.each(searchTerms, function(index, term) {
  var regX = new RegExp(term, "i");
  testArray = $.map(testArray, function(item) {
    if (regX.test(item)) {
      return item;
    } else {
      return;
    }
  });
});

console.log(testArray);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Если вы наблюдаете в приведенном выше коде, ключевыми словами являются "I", "right","know".Таким образом, результаты testArray должны быть такими, как показано ниже, строка

testArray = [
    "I am right and I know",    
    "I am wrong and I don't know",    
    "I don't know",
    "I do know",
    "I am"
  ]

содержит все ключевые слова, идущие первыми, а другие строки содержат "I","know", поэтому они идут следующим образом, а строка "I am" идет последней, поскольку она содержиттолько ключевое слово "I".

Codepen

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Вы можете попытаться создать регулярное выражение с этими условиями и отсортировать по количеству совпадений, например:

var testArray = [
    "I am",
    "i,i,i will come first i'm RIGHT i do KNOW",
    "I am wrong and I don't know",
    "I am right and I know",
    "I don't know",
    "I do know",
    "Something else"
  ],

  searchTerms = ["I", "right", "know"];


// (?:I)|(?:right)|(?:know)
const searchExp = new RegExp(searchTerms.reduce((acc, term) => acc ? `${acc}|(?:${term})` : `(?:${term})`, ''), 'gi');

const result = testArray.sort((a, b) => {
  const bMatch = b.match(searchExp) || [];
  const aMatch = a.match(searchExp) || [];

  return bMatch.length - aMatch.length;
});

console.log(result);
0 голосов
/ 04 июня 2018

Вы можете попробовать что-то вроде этого:

Идея:

  • Цикл по данным и критериям и создать карту, которая имеет как количество, так и значение.
  • Использованиерегулярное выражение для соответствия строке.Таким образом, вы можете выполнять поиск без учета регистра.
  • Сортировать эту карту по количеству.
  • Возвращать список значений.

function getMatchCountMap(data, criterias) {
  return data.reduce((countMap, curItem) => {
    var count = criterias.filter((criteria) => new RegExp(criteria, 'i').test(curItem) ).length;
    countMap.push({
      value: curItem,
      count: count
    });
    return countMap;
  }, [])
}

function sortBasedOnCount(data, criterias) {
  var map = getMatchCountMap(data, criterias);
  map.sort((a, b) => b.count - a.count);
  return map.map(x => x.value);
}

var testArray = [
    "I am",
    "I am wrong and I don't know",
    "I am right and I know",
    "I don't know",
    "I do know"
  ],
  searchTerms = ["I", "right","know"];
  
console.log(sortBasedOnCount(testArray, searchTerms))
0 голосов
/ 04 июня 2018

Вы можете взять объект для подсчета и отсортировать по количеству строк.

var array = [ "I am", "I am wrong and I don't know", "i am RIGHT and I know", "I don't know", "I do know", "i,i,i will come first i'm RIGHT i do KNOW"],
    search = ["I", "am","know"].map(v => v.toLowerCase()),
    count = array.reduce((c, k) => {
        var a = k.toLowerCase().split(/[^a-z0-9']+/),
            count = Object.create(null);

        a.forEach(w => count[w] = (count[w] || 0) + 1);
        c[k] = [0, 0];
        search.forEach(v => {
            c[k][0] += v in count;
            c[k][1] += count[v] || 0;
        });
        return c;
    }, Object.create(null));
  
array.sort((a, b) => count[b][0] - count[a][0] || count[b][1] - count[a][1]);

console.log(array);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...