Задать вопрос
  • Посчитать количество дней недели?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const mondaySunday = (d) => d.getDay() || 7; // чтоб воскресенье не 0, а 7
    const getShortWeek = (d, last = false) => {
      const D = new Date(d.getTime()); // копия, чтобы ориг. дату не сбить
      D.setDate(1); // 1-й день месяца
      if (! last) return 7 - mondaySunday(D);
      
      D.setMonth(D.getMonth() + 1); // добавить месяц
      D.setDate(D.getDate() - 1);   // отнять день
      return mondaySunday(D);
    }
    
    const leastDays = (d) => Math.min(getShortWeek(d), getShortWeek(d, true));
    
    
    leastDays(new Date(2021, 10, 10)) // 2
    Ответ написан
    1 комментарий
  • Как можно вычесть свободные отрезки?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В общем виде решение — отсортировать по времени события переключения состояния (с занято на свободно и наоборот). Двигаться по времени, собирая начала-концы интересующих состояний.
    Ответ написан
    Комментировать
  • Как отключить выполнение функции Javascript на других страницах?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Но как отключить работу этой функции на других страницах, чтобы могли выполняться последующие функции?


    Варианты:
    1. проверять, есть ли элемент, прежде, чем что-то с ним делать if (element) { /* что-то с ним делаем */ }
    2. проверять, на какой странице находимся
      if (window.location.pathname === "/contacts/form.html") { /* тут всякая магия */ }

    3. обернуть в
      try { /* здесь код который вызывает ошибки */ } catch() {}


    Ответ написан
    3 комментария
  • Как решить задачу по JavaScript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Сохранять в LocalStorage в браузере дату и id или хэш или сами показанные варианты.

    Перед выбором цитаты, убрать из массива ранее показанные, взяв инфу из LocalStorage, если она там есть, и проверив дату.

    Задача, вероятно, требует знания JS лучше, чем уровень document.write() (не используйте его).
    Ответ написан
    Комментировать
  • Как проверить элементы массива на совпадающие значения?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    перед сравнением приводите их к однозначному порядку элементов. Скажем, сортируйте алфавитно, и тогда "dmitryi" всегда окажется до "visokih".

    spoiler
    const unique = arr => {
        const result = [];
        const hashes = new Set();
    
        for (let str of arr) {
            const hash = str.split(':').sort().join(':');
            if (hashes.has(hash)) continue;
            hashes.add(hash);
            result.push(str);
        }
    
        return result;
    }
    P.S. у вас опечатка в имени Дмитрия — два разных варианта.
    Ответ написан
    3 комментария
  • Как реализовать следующую анимацию?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    canvas, не стирая всё полотно между кадрами )

    Например:
    Ответ написан
    2 комментария
  • Объединяет ли браузер два одинаковых эвента в один?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    // с заглавных букв ниже — сущности, которые стоит различать:

    Событие (Event) и Слушатель события (Listener) — это разные штуки.

    вот вы повесили два Слушателя на одно и то же Имя (или Тип) события на одном и том же Элементе. Это всё равно, что в один массив засунуть две функции. При наступлении События данного Типа, последовательно выполнятся все функции из «массива».

    Юзер кликнул мышкой — браузер создал Событие с Типом "click". Клик отправляется в путешествие: начинает с document и ныряет глубже до того элемента на котором была мышка. Затем это же событие всплывает наверх, обратно, до document.

    Где-то по пути Событие могут Слушать и Поймать (и не отпустить дальше). В вашем примере его поймают на document в конце обратного пути. И прогонят через строй Слушателей )
    Ответ написан
    Комментировать
  • Docker: принято ли ставить на продакшене?

    1. принято. Если кто-то станет шикать на вас за это — это их проблемы, а у нас свободные нравы!
    2. правильно.

    С монтированием – по-разному. Как удобнее. Варианты:
    • в проекте папка /docker под ней в подпапке /docker/nginx – конфиги nginx, которые биндятся в контейнер по одному, или всей подпапкой. Удобно, если захочется по-живому редактить конфиги;
    • в контейнер при его билде, инструкциями в его Dockerfile, копируются файлы из папки;
    • прилетает уже готовый-собранный образ, из которого поднимается рабочий контейнер, не запариваясь расположением конфигов и какими-то настройками.

    Логи направляются в Stdout контейнера и хранятся Docker'ом. Посмотреть хвост: docker logs --tail 50 имя_контейнера
    Ответ написан
    Комментировать
  • Можно/нужно улучшить это код?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    в этом коде неправильно готовят используют data-атрибуты
    Ответ написан
  • Как убрать нули, если они не нужны?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    $days.style.display = days ? "block" : "none";
    $hours.style.display = (days || hours) ? "block" : "none";
    $minutes.style.display = (days || hours || minutes) ? "block" : "none";
    Ответ написан
    2 комментария
  • Как реализовать поиск на js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    1. Медленные «дорогие» — операции по изменению DOM дерева. Поэтому всякие реактивные фреймворки типа Vue, React – работают с Shadow DOM – отрисовывая в реальный DOM только изменения.

    2. в окно не влезет более, чем N результатов поиска. Поэтому незачем каждый раз сразу отрисовывать все 10 тыс. результатов поиска по букве "С", например. Достаточно первые N показать. Т.е. тут нужен компонент «виртуальной прокрутки» — который рисует только то, что видно, а скролл-баром имитирует всю длину имеющихся результатов.

    Итого: я бы прикрутил VueJS и компонент виртуальной прокрутки, например, tangbc/vue-virtual-scroll-list
    Ответ написан
    Комментировать
  • Алгоритм для работы с датой?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Объекту Date можно устанавливать новую дату не только в рамках 1..31. Год, месяц скорректируются, если добавить, скажем, сразу 100500 дней. Этот / следующий день считаем в часовом поясе браузера:
    const isSameDay = (d1, d2) => d1.getFullYear() === d2.getFullYear()
      && d1.getMonth() === d2.getMonth()
      && d1.getDate() === d2.getDate();
    
    const compareDates = (ms1, ms2) => {
      const d1 = new Date(ms1);
      const d2 = new Date(ms2);
    
      if (isSameDay(d1, d2)) return "SAME_DAY";
      d1.setDate(d1.getDate() + 1); // тут и месяц и год добавятся, если надо
      if (isSameDay(d1, d2)) return "NEXT_DAY";
      return "OTHER";
    }


    Проверки

    compareDates(1635688540289, 1635688540289) // "SAME_DAY"
    compareDates(1635688540289, 1635768540289) // "NEXT_DAY"
    compareDates(1635688540289, 0) // "OTHER"

    Ответ написан
    Комментировать
  • Как найти сумму значений в массиве объектов?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    arr.reduce((acc, c) => acc + c.price, 0) // 8709
    Ответ написан
    1 комментарий
  • Как удалить лишь одно значение из строки?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Если работать именно со строкой, а не некой структурой данных с разделителем и пр. правилами, не описанными в вопросе, то так:
    echo  preg_replace('#Вода#', '', $something, 1); 
    //  ,Огонь,Вода,Вода,Трава,Небо
    Четвёртый параметр – лимит числа замен. Максимум одна замена.

    Ну или опишите, что это за особенная форматированная строка, где разделитель запятая, между запятых ровно одно слово, и если удаляется слово, надо и запятую тоже удалить.
    Ответ написан
    Комментировать
  • Можно ли как-то заменить value в JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    <h4><input type="radio" id="small" value="10" zamena="20">Маленька</h4>
    Для такого элемента заменить значение value значением из атрибута zamena можно так:
    const replaceValue = (el) => {
      el.value = el.getAttribute("zamena");
    }
    
    replaceValue(document.getElementById("small"));


    Вместо нестандартного атрибута zamena лучше пользоваться data-атрибутами.

    К элементу можно прицепить любые данные в data-* атрибутах. Например:
    <p data-price="100" data-size="Small" data-color="Red"></p>
    Получать их значение через свойство dataset:
    const element = document.querySelector("p");
    element.dataset.color // "Red"
    Ответ написан
    Комментировать
  • Как получать значение из дата атрибута, которое будет подставляться в объект date?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Хорошо бы держать в data-атрибуте момент окончания отсчёта в универсальном виде Unix timestamp. Тогда отсчёт не будет зависеть от часового пояса браузера посетителя сайта. Это целое число секунд с 1-го января 1970 по Гринвичу.

    Разметка будет примерно такая: <div class="timer" data-till="1635800892"></div>
    Получать из неё время просто:
    const D = new Date( 1000 * document.querySelector(".timer").dataset.till );
    В JavaScript время считают не в целых секундах, а точнее, в миллисекундах, поэтому секундное время из разметки надо домножить на 1000.
    Ответ написан
    6 комментариев
  • Что нужно чтобы создать нейросеть генерирующую изображения на основе обучения?

    Нужно поискать на github'е "GAN style transfer" и прочитать подробно Readme по использованию.
    Ответ написан
    Комментировать
  • Как это можно сделать?

    Объекты datetime.datetime можно сравнивать простыми операторами <, >
    Можно найти дату двухнедельной давности, и оставить в списоке только те, что больше неё:
    import datetime
    
    """ сейчас, интервал в 2 недели, и дата 2 недели назад """
    now = datetime.datetime.now()
    twoweeks = datetime.timedelta(days=14)
    backdate = now - twoweeks
    
    """ список дат """
    a = datetime.datetime(2020, 01, 01)
    b = datetime.datetime(2021, 01, 01)
    c = datetime.datetime(2021, 10, 18)
    date_list = [a, b, c]
    
    """ отобрать только недавние """
    recent = filter(lambda x: x > backdate, date_list)
    Ответ написан
    7 комментариев
  • Как обрезать строку в Javascript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    возвращать нулевую строку массива

    Нет. Посмотрите, что делает метод строки slice() — он возвращает часть строки.
    const str = "abcdef";
    // индексы:  012345
    
    str.slice(2, 4)
    // от индекса 2, т.е. "c"
    // до индекса 4 (но не включая его)
    // т.е. до "e", но без самой "e"
    // итого вернёт "cd"

    Что значит в коде + "..."

    Строки в JavaScript можно «складывать»:
    "Hello" + " world!" 
    // получится "Hello world!"
    
    "Понимаете?"  +  "..."


    Что значит : str

    Это часть «тернарного оператора». Как «унарный» от 1-го аргумента, «бинарный» – от двух аргументов, так «тернарный» – от трёх.

    Логически похоже на if () then {} else {}, но это выражение - туда нельзя засовывать дополнительные действя, как в if. Удобен для короткой записи, когда нужно вернуть то или иное значение, в зависимости от условия:
    let a = 5 > 2    ?  "5 больше 2"  :  "5 не больше 2";
            условие     если верно       если ложно
    Ответ написан
    Комментировать
  • Как отсортировать или пересобрать многомерный массив по значению?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Начиная с PHP 7.4 удобно использовать стрелочные функции:
    $input = [
        ["id" => "3", "name" => "Алёна", "rating" => "2159", ],
        ["id" => "199978927", "name" => "Wandermensil", "rating" => "6593", ],
        ["id" => "199983283", "name" => "Mirfshir", "rating" => "6320", ],
    ];
    
    usort($input, fn($a, $b) => $b["rating"] - $a["rating"]);
    /*
    array(3) {
        [0]=> array(3) { ["id"]=> string(9) "199978927" ["name"]=> string(12) "Wandermensil" ["rating"]=> string(4) "6593" }
        [1]=> array(3) { ["id"]=> string(9) "199983283" ["name"]=> string(8) "Mirfshir" ["rating"]=> string(4) "6320" }
        [2]=> array(3) { ["id"]=> string(1) "3" ["name"]=> string(10) "Алёна" ["rating"]=> string(4) "2159" }
    } 
    */
    Ответ написан
    1 комментарий