Задать вопрос
  • В чём ошибка в задаче?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Три подсказки.

    Проверить, что аргумент является строкой:
    typeof arg === 'string'
    // ещё можно длину проверить, а то, вдруг длинное пришлют
    arg.length === 1

    Проверить, что это буква и есть пара в другом регистре:
    arg.toLowerCase() !== arg.toUpperCase()
    // строка перевелась в разные кейсы

    В каком кейсе изначально была буква:
    arg.toUpperCase() === arg // значит, буква в верхнем регистре


    Из этих кирпичиков остаётся сложить домик. И чтоб не рухнул )
    Ответ написан
    1 комментарий
  • Как следить за статусом контейнеров?

    Если без внешних инструментов с бесплатным триалом и деньжищами за использование,
    можно через Docker API получать живой стрим событий. Отфильтровать в нём только интересующие, например, container=<string> когда имя интересующего контейнера известно и постоянно.

    Но вообще присмотритесь подробнее к опции restart – пусть контейнер перезапускается автоматом после падения. И может, при запуске как-то куда-то отправляет «Доброе утро, админ!»
    Ответ написан
    Комментировать
  • Не понимаю, как это работает?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Просто прочитайте документацию или ещё что-то про сортировку.

    Вопрос «что здесь принимается за a, а что за b?» не самый удачный: в примере аргументы игнорируются.
    В этом странном коде возвращается всегда отрицательное число. Значит, результат сортировки массива зависит только от внутренней реализации — от того, в каком порядке будут сравниваться пары элементов.
    Ответ написан
  • Как динамически импортировать изображение?

    Модули импортируются статически, ещё до выполнения любого кода.

    Есть вариант динамического асинхронного импорта import(moduleName). Но у этого способа главный недостаток: WebPack соберёт в отдельный чанк все файлы с флагами, и бандл будет тяжеловат.

    Если хочется красоты, можно заморочиться и дописать модуль, где прописаны импорты и тут же экспорты всех флагов. Типа
    import ru from "svg-country-flags/svg/ru.svg";
    import ua from "svg-country-flags/svg/ua.svg";
    // ...
    
    // и там же экспорты:
    export ru;
    export ua;
    // ...

    Тогда достаточно будет одной строкой импортировать нужные флаги import { ru, ua } from './mySuperModule';И Webpack разберётся и включит в бандл только нужное.

    Когда напишете такой вспомогательный модуль, отправьте, пожалуйста, pull-request в тот репо.
    Ответ написан
    Комментировать
  • Как JS проверить на пустоту или создание объекта?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    элемент же может и отсутствовать?

    Тогда document.querySelector("#******") вернёт undefined, и попытка получить из него свойство innerText выкинет ошибку. Загляните в консоль.

    Наверное, нужно проверять два условия: чтобы и элемент нашёлся, и чтобы текст в нём оказался не пустой строкой.

    Что-то типа
    const el = document.querySelector("#******");
    if (el) {
      const a = el.innerText;
      if (a.length === 0) {
        el.value = "123"; // а что это за элемент, у которого и innerText и value ?
      }
    }
    Ответ написан
    Комментировать
  • Как запустить Nginx балансировщик, если host not found in upstream?

    попробуйте через переменную:
    map $scheme $upstream_main {
      default app;
    }
    
    upstream bundle {
        server $upstream_main;
        server fallback backup;
    }
    Ответ написан
  • Как отслеживать смену значений в объекте?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const obj = { name: 'Boris', age: 5};
    
    // переназначить свойство с геттерами и сеттерами
    // ниже очччень сокращённый пример
    Object.defineProperty(obj, "name", {
      set(newName) {
        console.log("Name changed to", newName);
      }
    });
    
    // проверяем:
    obj.name = "Toster"; // в консоль выведет "Name changed to Toster"
    на деле нужно сохранить начальное значение, где-то хранить значение свойства name, и добавить геттер. Т.к. вероятно, не единственное свойство захочется так подменить, лучше будет воспользоваться «оптовым» Object.defineProperties() или в цикле по свойствам объекта каждое сделать реактивным интерактивным.

    Подробнее см. примеры для Object.defineProperty()
    Ответ написан
    2 комментария
  • Почему не отрабатывает forEach?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Дело в том, у какого объекта вызывать метод forEach()

    Сейчас, очевидно, вызываете на массиве или статичном NodeList'е, в который свежедобавленный элемент не попадает.

    Почувствуйте разницу между статичным и динамическим NodeList'ом. Первый содержит только те элементы, которые в него попали на момент создания. Динамический будет содержать и добавленные после.

    querySelectorAll() возвращает статичный набор.

    Решение, в общем – либо заново собирать элементы, и по ним запускать forEach(), или же получать динамическую коллекцию, используя соотв. метод.
    Ответ написан
    Комментировать
  • Как уменьшить количество таблиц-справочников с тремя-четырьмя строками?

    Для коротких списков есть тип данных: ENUM.
    Поддерживается, например, в MySQL, Postgres.

    Идеально подойдёт для:

    1. Статусы заказа (открыт/выпущен/закрыт и т. п.)
    2. Статусы сборки заказа (ожидает сборки, сборка начата, сборка проверена, сборка завершена)
    3. Формула оплаты заказа (тут много вариантов)
    4. Фонд оплаты (собственные средства, федеральный бюджет, территориальный и т. п.))
    5. Внутренний клиент (одно из возможных внутренних ООО)
    6. Ответственный сотрудник
    7. Территориальный сектор
    8. Направление

    Ответ написан
    1 комментарий
  • В каком порядке выполняется этот код?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    1. объявили функцию
    2. зарядили первый таймаут: он через 1 секунду вызовет showNumber(1)
    3. ... пауза 1c, ничего не происходит
    4. вызвалась showNumber(1) - вывела в консоль "1", и зарядила новый таймаут, уже с showNumber(2). Убедились, что 2 не равно 6.
    5. ... пауза 1с, опять скукота, ничего не происходит
    6. вызвалась showNumber(2), вывели в консоль "2", зарядили таймаут (3)
    7. ... ... ...
    8. наконец поднялся счётчик до 5. Всё то же: зарядили таймаут, прошла 1 секунда,
      вызвалась showNumber(5)
      Тоже выводит в консоль "5", заряжает таймаут (6), но на этот раз срабатывает условие 6 === 6, и раз так — тут же гасит свежезаряженный таймаут, ибо нечего ему срабатывать.
    9. Занавес.


    Наверное, не уловили пока, как работает setTimeout(). Вызов setTimeout() отрабатывает сразу и выполнение идёт дальше. Но этот вызов не выполняет, а лишь откладывает на потом – задачу вызова какой-то функции с параметрами.

    Пишет письмо с заданием, запечатывает в конверт и относит на почту. И идёт дальше по своим делам. А когда-то там письмо дойдёт, наконец – его распечатают и выполнят задание.
    Ответ написан
    Комментировать
  • Какой выбрать сервис для создания минималистического веб-сайта?

    sergiks
    @sergiks Куратор тега Веб-разработка
    ♬♬
    github pages
    Если я правильно понял, сайт — статичный.
    Ответ написан
    Комментировать
  • Как установить macOS catalina если у меня стоит macOS mountain lion?

    Верно, Catalina это самая верхняя версия OS X, которую можно установить на Macbook Pro 2012.

    Наверное, придётся в два шага:
    1. на Mountain Lion установить одну любую из Mojave, High Sierra (или совсем старые Sierra, El Capitan)
    2. на выбранную выше и установленную — установить Catalina
    Ответ написан
  • Как изменить класс определенного объекта из массива?

    один из вариантов — сделать эту разметку внутри самостоятельным компонентом. В который через пропсы передаётся объект статьи. Самостоятельно компонент обрабатывает клик по нему и меняет класс где-то внутри себя.

    другой вариант – признак «кликнутости» статьи (по умолчанию false) тоже держать в объекте artice. И при отрисовке учитывать его значение. По клику с индексом менять в исходных данных признак на true (разметка перерисуется).
    Ответ написан
    Комментировать
  • Как собрать новый массив из массивов в цикле по совпадению "ключ" - "значение"?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    можно через промежуточную структуру,
    где ключ город+product_id, а значения – массив с остальными полями.
    Ответ написан
    Комментировать
  • Как найти координаты Б когда известны координаты А, C?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Если даны только точки A, C — точку B можно располагать как угодно – они задают квадратичную кривую Безье втроём. Посмотрите примеры — ваш случай второй. Точки можно двигать.
    Ответ написан
    1 комментарий
  • Как проверить одинаковые данные?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Метод массива find() поможет найти, есть ли в массиве объект, удовлетворяющий требованию (вернёт этот объект или undefined)
    const users = [
      {name: 'Ann'},
      {name: 'George'},
      {name: 'Rebecca'}
    ];
    
    if (users.find(user => user.name === 'Rebecca')) {
      // уже есть такой юзер
    } else {
      // добавляем
    }
    Ответ написан
  • Почему setTimeout не работает в then?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Пока путаете функцию – с результатом её выполнения.
    Смотрите, что передаётся первым аргументом в setTimeout():

    setTimeout(console.log(p), 6000);
    здесь передаётся результат вызова console.log()

    setTimeout(console.log, 6000, p);
    а вот тут передаётся функция console.log, которую setTimeout() вызовет с аргументом p через 6 секунд.
    Ответ написан
    Комментировать
  • Как оптимизировать код?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно постараться не повторять себя (DRY = don't repeat yourself).
    const data = [];
    
    document.querySelectorAll('.item_row').forEach(row => {
      const region = row.querySelector('.item_region > a')?.textContent?.trim();
      if (region !== 'Минск') return;
    
      const name = row.querySelector('.title')?.textContent;
      const link = 'https://zooby.by/' + row.getAttribute('href');
    
      data.push({ name, link });
    });
    Ответ написан
    2 комментария
  • Как разрешить в input ввод только конкретных цифр?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Напомню, что input работает не с числами, а с текстом — строками.

    Может брать последний символ из строки? Если он 1..6 то заменять им всю строку (сделает из "12" просто "2"). Иначе ставить пустую строку:
    const input = document.querySelector('.input');
    
    input.addEventListener('input', event => {
        const { target } = event;
        const { value } = target;
        const last = value.slice(-1);
        target.value = last.match(/[1-6]/) ? last : '';
    });

    Вообще для такой задачи в интерфейсе может, вместо текстового поля лучше просто шесть кнопок сделать? От 1 до 6. Один тык — один выбор.
    А то с текстовым полем надо больше действий: перейти в него, нажать на клавиатуре цифру.
    Ответ написан
    Комментировать
  • Почему событие работает только на последнем элементе?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Цикл отработал, в переменной li содержится последний созданный элемент.
    На него и вешаете слушатель события, уже снаружи цикла.

    На все предыдущие элементы слушателя никто так и не повесил.

    Лучше как-то так:
    const clickHandle = () => {
      // ...
    };
    
    for (let i = 0; i < count; i++) {
      const li = createGameElement(newArr[i]);
      const { item } = li;
      ul.append(item);
      item.addEventListener('click', clickHandle);
    }
    Ответ написан
    Комментировать