Задать вопрос
  • Необходим ли здесь Symbol?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Без использования символа переменная handlers имеет значение undefined, которое тоже можно использовать как свойство объекта.
    const a = {};
    let b;
    a[b] = "test";
    
    JSON.stringify(a)
    // "{\"undefined\":\"test\"}"
    
    a[undefined] // "test"
    Ответ написан
    Комментировать
  • Как вызвать код функции?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Оберните код функции и вставьте его сразу в документ, не надо AJAX:
    const mySuperAnimationFunction = () => {
    
    // тут весь "код функции"
    
    }

    И когда нужно выполнить анимацию - доскроллили до места - вызывайте её: mySuperAnimationFunction();
    Ответ написан
    Комментировать
  • Как настроить таймер на javascript - время до открытия магазина?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно всё считать в локальной временной зоне. Известно смещение от UTC времени магазина. Текущее смещение посетителя от UTC получаем через getTimezoneOffset().

    Задача получить два объекта времени: открытия и закрытия магазина, во временной зоне браузера посетителя.

    Если какой-то из двух оказался в прошлом, добавляем ему один день, чтобы оба оказались в будущем. Который из двух оказался меньше – подскажет, открыт сейчас магазин или закрыт.

    Решение
    function tillItOpens() {
      const D = new Date();
      const shopOffsetMin = 5 * 60; // GMT+5
      const myOffsetMin = D.getTimezoneOffset();
      const diffMin = shopOffsetMin + myOffsetMin;
      
    
      function futureDate(hours, fixMin) {
        const d = new Date();
        d.setHours(hours);
        d.setMinutes(0 + fixMin);
        d.setSeconds(0, 0);
        if (d < new Date()) d.setDate(d.getDate() + 1);
        return d;
      }
    
      
      const dOpens = futureDate(9, diffMin);
      const dCloses = futureDate(21, diffMin);
    
      if (dOpens < dCloses) {
        // скоро откроется
        const hours = Math.floor((dOpens - D) / 36e5);
        const minutes = Math.floor((dOpens - D) / 6e4) - 60 * hours;
        
        return `до открытия ${hours}:${minutes}`
        
      } else {
        // сейчас открыто
        return "Сейчас открыто!";
        // хорошо ещё посмотреть, сколько остаётся до закрытия - успеет ли чел.
        // ближайшее закрытие – объект dCloses
      }
    }

    Если сейчас закрыт, запускайте таймер обратного отсчёта до объекта dOpens – он означает время открытия в текущей таймзоне.
    Ответ написан
    3 комментария
  • Как написать скрипт на PHP?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    sscanf()

    $str = '921205400655';
    list($year, $month, $day) = sscanf($str, "%2d%2d%2d");
    if ($year > 30) $year = 1900 + $year;
    else $year = 2000 + $year;
    $date = sprintf("%04d.%02d.%02d", $year, $month, $day);
    
    echo $date; // 1992.12.05
    Ответ написан
    6 комментариев
  • Почему код не работает?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Пишите не через точку, а так примерно:
    json['1 Часть'].t13[0]

    См. доступ к свойствам объекта.
    Ответ написан
  • Как проверить установку node.js на macOS?

    Может, терминал запущен до того, как установили, и не перечитал стартовые скрипты, где дописывается в PATH папка с node.

    1. Попробуйте в новом окне терминала node -v
    2. Наберите echo $PATH
    Ответ написан
    2 комментария
  • Получить по паре одинаковых случайных элементов массива?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Каждому четному индексу N соотв. такой же цвет с индексом N+1

    Возьмем случайное целое от 0 до половины длины, умножим на 2 и вуаля: это индекс первого. Плюс 1 это индекс второго.

    var idxA = 2 * Math.floor(Math.random() * colorsArray.length / 2);
    var idxB = idxA + 1;
    Ответ написан
    Комментировать
  • Как научиться рисовать на граф.планшете?

    В этом макете рисование от руки и планшет не потребовались.
    Adobe Illustrator, заготовки стрелочек, клипарт шляпы, шрифты.

    Как научиться рисовать – думаю, полно уроков на YouTube, поищите те, где они выстроены в серию из нескольких видео от простого к сложному. Хороши и оффлайн курсы, где бумага, карандаш, ластик.
    Ответ написан
  • Как получить access_token с правом app_widget?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Создаётся приложение-сообщества. Устанавливается в какое-то ваше Сообщество. И в нём выполняется этот вот "showGroupSettingsBox", 64

    После этого в Управлении сообществом – Работа с API появляется новый токен Сообщества:
    Права доступа: виджет приложения сообщества

    Документация про виджеты в сообществах.
    Ответ написан
  • Как подсчитать кол-во единиц в числах от 0 до N?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Создавать массив длиной в N может быть «дорого» – займёт память. Поэтому для метода «в лоб» предложу простой цикл с циклом для поиска «1» в каждом кандидате:
    const sumone = n => {
      let sum = 0;
      for (let i=n; i>0; i--) {
        const numstr = i.toString(10);
        for (let j=0, len = numstr.length; j<len; j++)
          if (numstr[j] == '1') sum++;
      }
      return sum;
    }

    Но можно подумать над формулой вычисления без перебора. Или частично сократить перебор. Например, для чисел, состоящих из одних «9» искомое число единиц в ряде вычисляется как функция числа цифр: d * 10^(d-1) Вот так:
    9 .. 1 = 1 * 10^0
    99 .. 20 = 2 * 10^1
    999 .. 300 = 3 * 10^2
    9999 .. 4000 = 4 * 10^3
    99999 .. 50000 = 5 * 10^4

    Например, для числа 12345 можно мгновенно получить сумму для 9999 и начать перебирать с 10000 до 12345. Это тоже можно упростить: отбросим первую единицу, она есть каждый раз, и остаётся то же, что от 0000 до 2345 + 2346 единиц.
    0..2345 в свою очередь опять сокращается: сразу известно 0..999, остаётся от 1000 до 2345.
    1000 .. 1999 опять упрощаем отбрасыванием первой единицы: на 999 приходится 300 единиц плюс 1000 первых единиц. Остаётся 2000 .. 2345. Тут можно отбросить двойку и посчитать только 0..345. Снова уходит 0..99. и т.д

    Надо будет ещё подумать над формулой..
    Ответ написан
    Комментировать
  • Как сделать из данного времени код в формате HEX?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Для цвета нужны значения трёх компонентов от 0 до 255 в десятичной системе, или от 00 до FF в шестнадцатиричной. С 16-ричной не обязательно связываться.
    body {
      background-color: rgb(123, 45, 67);
    }

    или динамически
    var R = 123, G = 45, B = 67;
    document.body.style.backgroundColor = `rgb(${R}, ${G}, ${B})`;

    Часы меняются от 0 до 23, минуты и секунды – от 0 до 60.
    Надо «спроецировать» каждое из них на диапазон 0..255.

    Например, часы:
    var D = new Date();
    var hours = D.getHours(); // 0..23
    var RR = Math.floor(255 * hours / 23); // 0 .. 255
    
    // то же с шестнадцатиричностью
    var RR = Math.floor(255 * hours / 23).toString(16); // 0..FF
    // может быть 1 или 2 цифры, надо всегда 2
    RR = ('0' + RR).substr(-2); // дописываем в начале 0 и берем последние две цифры

    Цвет будет меняться каждую секунду. Вроде бы, цель достигнута. Но хорошо бы придумать, как это сделать интереснее. Чтобы цвет менялся по кругу плавно, без резкого скачка в полночь. И больше напоминал цвет неба в это время суток.

    Ответ написан
    6 комментариев
  • Как соеденить 2 массива?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Метод, как предлагали уже многие:
    1. склеить оба массива в один,
    2. пройтись последовательно по всем, собирая «словарь», где уникальный ключ name, а значение – весь объект с name и value. Перезаписывать предыдущий с таким же name или нет – по условию;
    3. вернуть массив значений этого «словаря» - уцелевшие уникальные объекты.


    const uniq = (a, b) => Object.values(
      a.concat(b).reduce(
        (acc, o) => {
          if (!acc[o.name]) acc[o.name] = o;
          else if (Number.isFinite(o.value)) acc[o.name].value = o.value;
          return acc;
        }, {}
      )
    );

    Для проверки, число это или нет, можно использовать метод Number.isFinite()

    Тесты
    //###########################
    const first = [{ name: 'first', value: '' }, { name: 'second', value: 10 }];
    const second = [{ name: 'first', value: 0 }, { name: 'third', value: 20 }];
    /*
    [
      {
        "name": "first",
        "value": 0
      },
      {
        "name": "second",
        "value": 10
      },
      {
        "name": "third",
        "value": 20
      }
    ]
    */
    
    //###########################
    const first = [{ name: 'first', value: 100 }, { name: 'second', value: 0 }];
    const second = [{ name: 'first', value: -111 }, { name: 'second', value: '' }];
    
    /*
    [
      {
        "name": "first",
        "value": -111
      },
      {
        "name": "second",
        "value": 0
      }
    ]
    */
    Ответ написан
    Комментировать
  • Как написать формулу скидки в зависимости от количества товара?

    Первый вариант: скидка растёт линейно от 0% до максимальной скидки, скажем 50%, которая наступает, если взять 70 единиц товара, и дальше не растёт. Гуглите уравнение прямой, проходящей через две точки.
    график
    5d3083611188d540332498.png


    Второй вариант: использовать сигмоиду (S-образный график) y = 1 / (e^x + 1)
    график

    y = 50 / (ℯ^(5 - x / 8) + 1)
    5d30899121998751229032.png
    Ответ написан
    Комментировать
  • Как переключаться между обычным окном и инкогнито хрома на mac os?

    Комбинация для переключения между окнами одного приложения:
    cmd + `
    или
    cmd + ~
    Ответ написан
    Комментировать
  • Чем заменить body onload?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    window.addEventListener('load', (event) => {
        script.sessionLoaded();
    });


    onload срабатывает, когда загрузилась страница и все её ресурсы: CSS, картинки, шрифты.
    в отличие от DOMContentLoaded, который выстреливает возможно раньше – когда только загрузился HTML и построено DOM дерево, но ещё не подгрузились внешние ресурсы.
    Ответ написан
    Комментировать
  • Хранение данных в localstorage?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Способом, как у вас 2-я строка, получите сохранённый ранее массив users, и в него пушьте.

    Рекомендации:
    1. Названия ключей LS лучше держать в константах, а не писать строкой каждый раз.
    2. Предусмотрите вариант, когда в LS ничего нет – с этим точно столкнётесь впервые с массивом users
    3. Предусмотрите вариант, что LS в принципе недоступно - например в режиме Private Browsing.
    Ответ написан
    3 комментария
  • Как с помощью jsonpath извлечь из массива объектов значение одного свойства зная значение другого?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    $[?(@.population == 2870528)].name

    Попробовать можно на jsonpath.com
    скрин
    5d2f068690488541075820.png


    См. язык запросов. Фильтр ?( условие )
    Ответ написан
    Комментировать
  • Какой самый быстрый язык для бота ВК?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Ассемблер, Си.
    Но какая разница? Сделайте для начала медленного бота с кучей недостатков.
    У вашего первого бота обязательно должны быть недостатки, иначе неправильно это как-то.
    Ответ написан
    Комментировать
  • Как использовать import?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Скачал jsonpath.min.js, подключил его в index.html (нужно ли это?).

    Всё правильно сделали, так тоже можно. После этого у вас должна быть доступна глобальная переменная jsonpath – к ней и обращайтесь:
    var cities = [
      { name: "London", "population": 8615246 },
      { name: "Berlin", "population": 3517424 },
      { name: "Madrid", "population": 3165235 },
      { name: "Rome",   "population": 2870528 }
    ];
    
    var jp = jsonpath; //  для краткости
    var names = jp.query(cities, '$..name');
    console.log(names); // [ "London", "Berlin", "Madrid", "Rome" ]
    Fiddle

    Ну а вообще рано или поздно всё равно придётся научиться в модули и сборщики – например, Webpack.
    Ответ написан
  • Как сделать элементы массива жирными или курсивом?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Как сделать элементы жирными или курсивом:
    // через методы строки .bold() и .italics()
    var html = "Понедельник".italics(); // html==='<i>Понедельник</i>';
    var html = "Суббота".bold(); // html==='<b>Суббота</b>';
    
    // вручную собрать строку
    var dow = 'Понедельник';
    var html = '<i>' + dow + '</i>'; // html==='<i>Понедельник</i>';
    
    // то же самое в обратных кавычках
    var dow = 'Понедельник';
    var html = `<i>${dow}</i>`; // html==='<i>Понедельник</i>';

    Правильнее через CSS, но сейчас не об этом.

    document.write() – плохая практика, не надо его.
    Лучше собрать HTML в строку и потом присобачить куда-то:
    const week = ['Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресенье'];
    
    for (let i = 0, len = week.length; i < len; i++) {
        let html = week[i];
        if (i === 0) html = html.italics(); // понедельник
        else if (i > 4) html = html.bold(); // выходные
    
        const div = document.createElement('div');
        div.innerHTML = html;
        document.body.appendChild(div);
    }
    Ответ написан
    1 комментарий