Как сравнить строку с массивом строк по длине?

/**
 * @param {string} str1 - the first string to compare
 * @param {string} str2 - the second string to compare
 * @returns {number} the absolute difference in length between `str1` and `str2`
 */
const getDistanceByLength = (str1, str2) => {
  return Math.abs(str1.length-str2.length);
};

/**
 * @param {string} word - the original string
 * @param {string[]} words - an array of strings
 * @param {(str1: string, str2: string) => number} - a function that
 *  takes two strings and returns a number representing the distance between them
 * @param {number} threshold - the maximum distance that is still considered "close"
 * @returns {string} the string in `words` with the minimum distance to `word`
 *  as calculated by `distanceFn`, unless that distance is strictly greater than
 *  the `threshold`, in which case the original `word` is returned.
 */
const getClosestWord = (word, words, getDistanceByLength, threshold) => {
  for(i=0;i<words.length;i++){
    if (getDistanceByLength(word,words[i]) <= threshold){
      return words[i];
    }
  }
  return word;

};

Проблема, с которой я столкнулся, заключается в том, что я просто не могу понять логику, необходимую в getClosestWord(), чтобы пройти через массив и получить кратчайшее расстояние (от getDistanceByLength). Он также возвращает первый word, если расстояние больше threshold. Прямо сейчас он прекращает цикл, как только встречает слово, соответствующее критериям, вместо того, чтобы просматривать весь массив и выбирать words[i], имеющее самое короткое расстояние.

word — это просто случайное слово, переданное в функцию. Массив words, который я использую:

words: ["bed", "bank", "fence", "bridges"]

Если что-то из этого звучит снисходительно, пожалуйста, дайте мне знать, или если вам всем нужна дополнительная информация.

использование return внутри вашего цикла остановит его. Вам нужно будет проверить все свои слова, чтобы вы не могли return внутри цикла. Вместо возврата внутрь цикла обновите переменную, которая отслеживает слово с видимым в данный момент кратчайшим расстоянием, меньшим вашего порога, а затем верните его в конце.

Nick Parsons 08.05.2024 06:19

Как будет выглядеть логика постоянного обновления переменной? Должен ли я вложить еще один цикл? Я просто не могу понять, как лучше всего это реализовать.

antjuh 08.05.2024 06:53
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы найти слово с кратчайшим расстоянием в вашем массиве, меньшим порога, вам необходимо:

  • Проверьте все слова в массиве (это означает, что вы не можете return внутри цикла, так как это приведет к его досрочному завершению)
  • Убедитесь, что расстояние до текущего слова меньше порогового расстояния.
  • Убедитесь, что расстояние до текущего слова меньше, чем расстояние до ближайшего слова, которое вы видели ранее.

Чтобы удалить return в середине цикла, вам следует отслеживать, какое слово является ближайшим к вам до сих пор. Ниже я сохраняю это слово в переменной с именем closestWord, чтобы вы могли вернуть его после завершения цикла (после завершения цикла вы просмотрели все слова, поэтому можете с уверенностью сказать, что ближайшее слово находится в closestWord). ). Еще одна вещь, которую вы можете сохранить (но не обязательно), — это рассчитанное расстояние до closestWord. Ниже я сохраняю это в closestDist. Это позволяет вам подтвердить, что расстояние, рассчитанное для текущего слова, меньше (или равно, если вы хотите получить последнее увиденное слово с самым близким расстоянием) ближайшего расстояния к слову, замеченного до сих пор. Технически мы могли бы удалить closestDist, так как его можно вычислить, вызвав getDistanceByLength и передав closestWord и word, но это позволяет нам инициализировать его как Infinity, что упрощает логику сравнения внутри цикла, поскольку вам не нужно указывать специальный регистр для Когда вы впервые встречаете слово, значение которого меньше порога для обновления closestWord:

const getDistanceByLength = (str1, str2) => Math.abs(str1.length - str2.length);

const getClosestWord = (word, words, distanceFn, threshold) => {
  let closestWord = word;
  let closestDist = Infinity;
  for (let i = 0; i < words.length; i++) {
    const currDist = distanceFn(word, words[i]);
    // If the current word's distance is less than the threshold
    // and its distance is less than the distance for the closest word seen so far
    if (currDist <= threshold && currDist <= closestDist) {
      closestWord = words[i];
      closestDist = currDist;
    }
  }
  return closestWord;
};

console.info(getClosestWord(
  "mouse", ["fish", "cat", "dog", "bird", "ant", "ox", "squid"],
  getDistanceByLength,
  4
));

Это отлично работает, спасибо! Однако по какой-то причине, когда я передаю строку из шести символов, а в массиве нет строки из шести символов, по умолчанию используется следующая более высокая строка. (т. е. я прохожу через rivers, но в моем массиве есть только fence и bridges. Кажется, по умолчанию всегда используется bridges.) Знаете почему? Это просто порядок передачи?

antjuh 08.05.2024 07:22

@antjuh Привет, он выберет последнюю ближайшую строку в массиве, так что да, это основано на порядке. Поскольку расстояние между fence и bridges равно 1 (для слова rivers), но мосты идут последними, он выбирает именно это. Если вы хотите, чтобы это была первая ближайшая строка, вы можете изменить currDist <= closestDist на currDist < closestDist

Nick Parsons 08.05.2024 07:29

Другие вопросы по теме