• Возможно ли сделать невидимую метку для символа в строке?

    @syntaxorange
    Я бы использовал индексы исключающих символов `X` в качестве меток исходной строки.

    const pattern = '...XX....XX.............X.......';
    const parseStr = '...XX....XX.....X.......X...XX.X.';
    
    const indices = pattern.split('').map((v, i) => v === 'X' ? i : '').join('');
    const result = parseStr.split('').filter((v, i) => !~indices.search(i) ).join('');
    Ответ написан
    1 комментарий
  • Как сделать так, чтобы при нажатие на кнопку отображалось только то меню, к которому оно относится?

    @syntaxorange
    function clickBtn() {
        var $btn = $('.programm__list-item__btn');
        var $sublist = $('.programm__list-item__sublist');
    
        $btn.click(function(event) {
            var $target = $(event.currentTarget);
            var $dropdown = $target.next();
    
            $btn.not($target).toggleClass('active', false);
            $sublist.not($dropdown).toggleClass('active', false);
            $target.toggleClass('active', true);
            $dropdown.toggleClass('active', true);
        });
    };
    
    clickBtn();
    Ответ написан
    1 комментарий
  • Как сделать красную линию короче?

    @syntaxorange
    Лучше используйте псевдоэлемент `::after` на селекторе `.header`

    .header {
        position: relative;
        border-bottom: 4px solid transparent;
    }
    
    .header::after {
        position: absolute;
        z-index: 1;
        left: 2.5%;
        bottom: -4px;
        width: 95%;
        height: 4px;
        content: '';
        background-color: #f00;
    }
    Ответ написан
    3 комментария
  • Почему я не могу выровнять таким способом несколько элементов?

    @syntaxorange
    Вы позиционируете родительский контейнер, который растянут на всю ширину страницы. Разумется после сдвигов с одинковыми величинами он возвращается на своё исходное положение. Задайте родителю тоже блочно-строчный бокс, чтобы его ширина зависела от размера потомков.
    Ответ написан
    Комментировать
  • Как вычислить степень числа с помощью цикла?

    @syntaxorange
    function pow(x, n) {
        const isNegative = n < 0;
        let result = 1;
    
        n = isNegative ? Math.abs(n) : n;
    
        for (let i = 1; i <= n; i++) {
          result *= x;
        }
    
        return isNegative ? (1 / result) : result;
    }
    Ответ написан
    2 комментария
  • Как рекурсивно удалить текстовые узлы?

    @syntaxorange
    Начинать обход дерева `DOM` следует с корневого элемента. В нашем случае рутовым элементов является `body`.
    Рекомендация - лучше стараться максимально упрощать требования, чтобы легче получалось обдумывать создаваемый алгоритм.

    Начните с простой разметки, а затем добавляйте дополнительные, вложенные элементы.
    <span>text1</span><span>text2</span>

    Следует сформулировать два вопроса.

    1. Как лучше удалять текстовый узел?
    2. Как избежать бесконечного вызова рекурсии?

    Алгоритм:

    1. Вызывая функцию, стартуем обход дерева с элемента `body`. Передаём элемент при первом вызове.
    2. Получаем коллекцию дочерних сущностей переданного элемента.
    3. Фильтруем сущности с типом `ELEMENT_NODE`, кроме элемента с именем `SCRIPT`.
    4. Удаляем сущности с типом `TEXT_NODE` в отдельной итерации или предыдущей итерации. Используем для этого метод `remove` прямо на узле (ответ на первый вопрос).
    5. Итерируем только по найденным элементам (ответ на второй вопрос). Вызываем рекурсивно функцию, передавая найденный элемент. Если во вложенном элементе будут найдены только текстовые узлы, повторного вызова функцию не случится для текущей глубины. Но программа возвратится к предыдущей итерации и продолжит рекурсивный вызов со следующими элементами.

    UPD. Раз уже есть примеры реализации, добавлю код.
    function deleteTextNodesRecursive(element) {
      const childNodes = element.childNodes;
      
      var elements = [...childNodes].filter((val) => {
        if (val.nodeType === 3) {
          val.remove();
        }
        
        return val.nodeType === 1 && val.nodeName.toLowerCase() !== 'script';
      });
      
      if (elements.length) {
        elements.forEach((el) => {
          return deleteTextNodesRecursive(el);
        });
      }
      
      return document.body;
    }
    console.log(deleteTextNodesRecursive(document.body));
    Ответ написан
  • Как из string "ok" и "+" Вытащить значение true но при "-" и "0" оставалось false?

    @syntaxorange
    Используйте объектный литерал для хранения ассоциативных значений.
    Кстати, объект `Number` и нижележащие объекты можно не обёртывать оператором группировки `()`.

    function getStatistic(name, answer) {
        const r = {
            '+': true,
            'ok': true,
            '-': false,
            '0': false
        };
    
        if (r[answer] === false) {
            console.log(name + ` doesn't understand` )
        } else {
            console.log(name + ` understand`)
        }
    }
    
    getStatistic(`Boris`, '-')
    Ответ написан
    Комментировать
  • Как адекватнее сделать переходы по якорям по клику одной кнопки?

    @syntaxorange
    Концептуально вы описали самый разумный подход. Только в реализации вижу пробелы. Якоря работают через идентификаторы, никаких классов.
    Сперва кэшируем (фильтруем при необходимости) обёрнутый набор инпутов при инициализации программы (если они не добавляются динамически), а не в момент клика. Кнопке (элементу a), устанавливаем `href` идентификатор первого инпута. В коллбэке клика ищем релевантный `href` инпут по айди. Интересует нас не он, а следующий, идущий за ним инпут где-то в дереве DOM. Извлекаем идентификатор у него и перезаписываем `href` нашей "кнопке" порождающей событие клика.
    Ответ написан