Как реализовать поиск соответствий в тексте, используя массив неопределенной длины?

Как получить массив строк, проиндексированных в порядке, в котором они встречаются в массиве texts, но сначала идут строки, в которых содержится наибольшее количество соответствий элементам массива arr, а затем идут строки с меньшим количеством соответствий? Важно, чтобы при этом не изменять и не удалять элементы из результирующего массива, и не изменять исходный порядок элементов в массиве arr. Пример входных данных и ожидаемого результата представлены в коде выше.
  • 26 октября 2023 г. 14:58
Ответы на вопрос 3
Вам нужно создать функцию, которая принимает два массива: texts и arr. Эта функция будет искать соответствия элементов arr в каждой строке texts, считать количество соответствий и возвращать новый массив строк, отсортированный по убыванию количества соответствий.

Вот одно из возможных решений на языке JavaScript:

```javascript
function findMatches(texts, arr) {
  // Создаем новый массив для результатов
  var result = [];

  // Создаем объект для подсчета количества соответствий
  var matchCount = {};

  // Проходимся по каждой строке в массиве texts
  for (var i = 0; i < texts.length; i++) {
    var count = 0; // Инициализируем счетчик соответствий в 0

    // Проходимся по каждому элементу в arr
    for (var j = 0; j < arr.length; j++) {
      // Если элемент arr присутствует в текущей строке texts, увеличиваем счетчик на 1
      if (texts[i].indexOf(arr[j]) !== -1) {
        count++;
      }
    }

    // Сохраняем количество соответствий для данной строки
    matchCount[texts[i]] = count;
  }

  // Сортируем строки в порядке убывания количества соответствий
  var sorted = Object.keys(matchCount).sort(function(a, b) {
    return matchCount[b] - matchCount[a];
  });

  // Добавляем строки в результирующий массив
  for (var k = 0; k < sorted.length; k++) {
    result.push(sorted[k]);
  }

  return result;
}

// Пример использования:
var texts = [
  "apple banana orange",
  "orange mango banana",
  "banana apple mango",
  "strawberry orange apple"
];

var arr = ["apple", "banana"];

var result = findMatches(texts, arr);
console.log(result);
```

Ожидаемый результат:

```
[
  "banana apple mango",
  "apple banana orange",
  "orange mango banana",
  "strawberry orange apple"
]
```

В этом примере функция `findMatches` проходится по каждой строке в массиве `texts` и подсчитывает количество соответствий элементам массива `arr`. Затем она сохраняет количество соответствий для каждой строки в объекте `matchCount`. После этого она сортирует строки в порядке убывания количества соответствий и добавляет их в результирующий массив `result`.
https://jsbin.com/dewogoxoqu/edit?js,console
Функция "sortByMatches" принимает два массива: matchesArr и strArr. Она фильтрует strArr, чтобы оставить только те элементы, в которых есть хотя бы один элемент из matchesArr. Затем она сортирует этот отфильтрованный массив по количеству элементов из matchesArr, которые содержатся в каждом элементе strArr. Как результат, функция возвращает отсортированный массив strArr.
Похожие вопросы