Есть ли метод JavaScript для этой логической проблемы?

Я пытаюсь решить практическую проблему в JS, и идея ее состоит в том, чтобы использовать некоторые методы и сделать ее максимально эффективной.

Эта проблема:

Мне нужно найти, сколько раз я могу составить слово DOGGY внутри заданной строки заглавных букв.

Например:

  • Внутри строки «DHTHTOMMGGSDY» я могу составить слово DOGGY только 1 раз.
  • Внутри строки «DXOXGGYDXOXGGY» я могу составить слово DOGGY 2. раз.
  • Внутри строки «DXOXGXY» я могу составить слово DOGGY 0 раз.

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

Я пытался разобрать строку в массив с помощью оператора распространения [...string], а затем с помощью метода filter() вернуть переменную с отфильтрованными словами, но у меня были проблемы с «G», потому что они должны повторяться.

Вот где я до сих пор:

let result = [...string].filter((char) => {
        let word = char !== 'D' && char !== 'O' && char !== 'G' && char !== 'G' && char !== 'Y';
        console.info(word);
    });

    console.info(result);

нет, понял TypeError: Cannot read properties of null (reading 'length')

Ignacio García 17.11.2022 01:06

почти там.. теперь он всегда возвращается 0

Ignacio García 17.11.2022 01:10

Просто у меня это работает странно... теперь он возвращает только 2 даже с этой строкой: 'DXOXGGY'

Ignacio García 17.11.2022 01:24

Да, в этом случае он возвращает 2, но с этой строкой: DXOXGGY он также возвращает 2 и должен быть 1

Ignacio García 17.11.2022 01:36

ой, да, я сделал это неправильно - забыл флаг g :p

Jaromanda X 17.11.2022 01:38

Я все еще застрял с этим упражнением. Пробовал с флагом g, но всегда возвращает 0. Вот что я делаю: let result = S.match(/(D.?O.?G.?G.?Y)/g)?.length ?? 0;

Ignacio García 17.11.2022 14:35

это не то, что у меня было

Jaromanda X 17.11.2022 23:23
Поведение ключевого слова "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
7
59
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать фильтр и включает

    function findPhrase(input, searchedPhrase) {
        const inputWithSearchedPhraseLettersOnly = [...input].filter(letter => searchedPhrase.includes(letter)).join('');
    
        return inputWithSearchedPhraseLettersOnly;
    }
    (() => {
        const input = 'DXOXGGYDXOXGGYXXXDOXXGXXXGYX';
        const searchedPhrase = 'DOGGY';
        const result = findPhrase(input, searchedPhrase).split(searchedPhrase).length - 1;
        console.info(result);
    })();

Привет, он всегда возвращает 0 для меня.

Ignacio García 17.11.2022 12:53

вы можете использовать этот простой способ

let dog = "DXOXGGYDXOXGGY";
dog = dog.split("X").join('');
const dogs = dog.match(/DOGGY/g).length;

console.info(dogs)

Я не поставил этот пример в исходный вопрос, но есть и такие строки: DHTHTOMMGGSDY, и в этом случае это не сработает. Сейчас добавлю, спасибо за ответ

Ignacio García 17.11.2022 01:58
Ответ принят как подходящий

Всего день или два и сотни чашек кофе опоздали. Если вы найдете ошибку, сообщите мне об этом аккуратно, пожалуйста...

      const searchString = "DOGGY";
      const targetStrings = [
        "DHTHTOMMGGSDY",
        "DXOXGGYDXOXGGY",
        "DXOXGXY"
      ];
      const searchArray = searchString.split("");

      console.info("searchString", searchString);
      console.info("****************************");

      targetStrings.forEach(function (targetString) {
        const targetArray = targetString.split("");
        console.info("targetString", targetString);
        let occurrences = 0;
        while (true) {
          let allCharsFound = searchArray.every(function (char) {
            const index = targetArray.indexOf(char);
            if (index === -1) {
              return false;
            }
            targetArray.splice(index, 1);
            return true;
          });
          if (allCharsFound) {
            occurrences++;
          } else {
            break;
          }
        }
        
        console.info("occurrences", occurrences);
        console.info("----------------------------");

      });

Спасибо @ user3425506, отлично работает! Извините, я только сейчас увидел ваш ответ.

Ignacio García 21.11.2022 05:06

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