Задать вопрос
  • Почему свойство length начинает считать с единицы, а не с нуля, если в массиве счет начинается с нуля?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Как раз с длиной всё очевидно. length – количество элементов массива:
    []; // сколько элементов? – 0
    ['a']; // сколько элементов: 1
    ['a', 'b', 'c']  // 3

    Индексы начинают с нуля, потому, что индекс – это смещение.
    Исторически, с низкоуровневых языков программирования.
    В памяти под массив выделена некоторая память, начиная с адреса X.
    Последовательно находятся ячейки одинаковой длины. Чтобы найти, где лежит значение i-го элемента, к адресу X прибавляют i * size байт. Самый первый элемент начинается сразу с адреса X. Его индекс 0.

    Так же и со строкой в JavaScript: к буквам можно обращаться по индексу, как к элементам массива.
    "abcd"[1] // "b"
    "abcd"[3] // "d"
    Представьте, что в начале строки стоит курсор. Курсор возвращает букву перед которой стоит. Индекс – на сколько вправо надо этот курсор подвинуть.

    Эта особенность index / length общепринята во многих языках программирования. Так же, как для интервалов часто принято включать начало и исключать конец: [a; b) – например, в методе массива slice(), который вырезает кусок массива, если указать slice(1, 5) — вытащит элементы с индексами 1, 2, 3, 4 – включая 1-й, но не доходя до 5.
    Ответ написан
    Комментировать
  • Обновить страницу по клику?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    повилось больше 1 продукта, и всё, крах: id ведь на странице должен быть уникальным, а у вас их может быть и больше 1.

    Замените id на класс.
    Что-то типа
    const btnClassName = "btn_refresh";
    
    document.querySelectorAll('.woosb-products').forEach(n => {
      n.insertAdjacentHTML('afterend', `<button class="${btnClassName}">обновить</button>`);
    });
    
    document.addEventListener('click', (event) => {
      if (event.target.classList.contains(btnClassName)) {
        window.location.reload();
      }
    });


    Upd. Так как выяснилось, что кнопка должна быть только одна, лучше только одну и создавать:
    const product = document.querySelector('.woosb-products');
    if (product) {
      const button = document.createElement('button');
      button.id = 'b_epr';
      button.innerText = 'обновить';
      button.addEventListener('click', () => window.location.reload());
      product.insertAdjacentElement('afterend', button);
    }
    Ответ написан
  • Что лучше, самовызывающаяся функция или объект для плагина?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    У 1-го варианта возможен косяк, если вдруг подключат файл с плагином дважды: ошибка из-за переопределения переменной Plugin. Как вам вариант:
    { // обернуть, чтобы не засорять глобальную область
    
      // внутри любая анархия, переменные
    
      // исходный вариант 1
      const Plugin = {
        param1: 1,
        param2: 1,
        method1(){
          //
        },
        method2(){
          //
        }
      };
    
      window.Plugin = Plugin;
    }
    Ответ написан
  • Почему не получается получить состояние стороннего сервиса?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    docker.ping() видимо, возвращает Promise. Надо дождаться его выполнения и только тогда возвращать ответ.
    примерно так
    const promises = endpoints.filter((i) => i.type === 1)
    .map((i) => {
      const result = {
        id: i.id,
        name: i.name,
        type: i.type,
        url: i.url,
        groupId: i.groupId
      };
    
      const settings = (i.url.match('unix:///var/run/docker.sock')) ?
          {socketPath: '/var/run/docker.sock'} : {host: i.url, port: 2375};
      const docker = new Docker(settings);
    
      return docker.ping().then(err => {
        result.status = !err;
        return result;
      })
    });
    
    Promise.all(promises).then((results) => res.send(results));
    Ответ написан
    Комментировать
  • Для чего записывать в переменную?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Названия не удачны: название переменной инвертирует смысл:
    $allowDuplicate = $rsPackInfo->DuplicateNotAllowed;

    "allowDuplicate" позволяет дубликат, а "DuplicateNotAllowed" наоборот, ожидается true, когда дубль запрещён.

    В общем код пахнет так-себе.
    Ответ написан
    Комментировать
  • Как построить такую перспективу?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В Adobe Photoshop есть похожий инструмент, называется Vanishing Point.

    4 точки задают сетку, которую можно продлить и за границы четырёхугольника. Т.е. точки только определяют характеристики искажения для целой плоскости. Помещённую на полученную перспективную сетку картинку можно увеличивать и двигать.

    Четырёхугольник считается изначально прямоугольником фиксированной пропорцией ширины к высоте. Например, квадратом. Когда его углы перемещаются, противоположные грани перестают быть параллельными и появляется точка их пересечения (vanishing point) – типа, как бесконечно удалённая точка.

    Подробнее про перспективу и её математику (на англ.) например тут и тут.

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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Смотрите в сторону автоматизации браузера и безголовых (headless) браузеров. Наверное, затея поможет вам разобраться с новой технической темой, но я бы попросил вас воздержаться от рассылки сообщений и найти более элегантный способ решать конфликт с компанией.
    Ответ написан
  • Как поменять функции местами в js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Есть 2 возможных состояния: работает слайдер, или статичные теги. Одна функция пусть устанавливает одно или второе:
    const sliderOptions = {
      arrows: true,
      dots: false,
      variableWidth: true,
      centerMode: true,
      slidesToShow: 8,
      autoplay: true,
      autoplaySpeed: 2000,
      slidesToScroll: 3,
      nextArrow: '<div class="tags__arrow tags__arrow_next">',
      prevArrow: '<div class="tags__arrow tags__arrow_prev">',
      appendArrows: $('.tags__arrows'),
    }
    
    const sliderSet = (is_on) => {
      if (is_on) {
        $('.tags__option_on').hide();
        $('.tags__option_off').show();
        $('.tags__inner').slick(sliderOptions);
      } else {
        $('.tags__option_on').show();
        $('.tags__option_off').hide();
        $('.tags__inner').slick('unslick');
      }
    }
    
    $('.tags__option_on').on('click', () => sliderSet(true));
    $('.tags__option_off').on('click', () => sliderSet(false));
    
    sliderSet(false); // начальное состояние
    Ответ написан
    Комментировать
  • Как изменить значение переменной?

    Запрос курсов с сайта занимает время — операция асинхронна. Её результат оказывается «потом» в коллбэке, в функции (err, res, body) => { ... }.

    А вот все эти console.log() выполняются прямо сразу – поэтому в них ещё ничего нет и выводится 0.

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

    Семафор: записывать process_id (pid) в текстовый файл.
    Обработчик пинга смотрит, есть ли файл, читает из него pid и смотрит, жив ли такой процесс. Если нет – запускает задачу и записывает её pid в файл.
    При завершении обработки задачи файл удаляется.
    Ответ написан
    Комментировать
  • Как кешировать php данные с mysql?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    1. cоздать PHP скрипт, который будет запускаться по крону
    2. в нём открыть соединение с базой и выполнить запрос
    3. открыть файл для записи и записать в него полученные данные
    4. закрыть файл

    С каким шагом сложности?
    Ответ написан
  • Какая разница между await и Promise?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Promise – сложная штуковина для асинхроты всякой, с кучей методов.
    Зачем забивать себе голову, если можно зайти на QnA, задать вопрос и поджидать await готовый ответ.
    В это время не сидеть-тупить в экран, а пойти чайку попить. Как появится ответ — продолжим дальше.
    Ответ написан
    7 комментариев
  • Как создать массивы из JSON?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Не «как», а «когда».

    Там, где console.log() выводит успешно то, что надо — там же и инициализируйте autocomplete.
    Ответ написан
    3 комментария
  • Как анимировать элементы одновременно?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Попробуйте так:
    const animateElement = (el) => {
      const endValue = +el.dataset.value;
      let currValue = 0;
    
      const update = () => {
        el.innerText = ++currValue;
        if (currValue < endValue) {
          setTimeout(update, 20);
        }
      }
    
      update();
    }
    
    [...document.querySelectorAll('[data-value]')].forEach(animateElement);
    Тут неоптимальный момент, обилие часто создаваемых Timeout'ов: при большом количестве элементов и короткой задержке может тормозить. Альтернативный вариант сделать единые общие «часы» обновляющие, при необходимости, каждого участника коллекции.
    Ответ написан
    Комментировать
  • Как отменить предыдущее условие в if?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    я бы предложил разделить логику от представления. Хотя бы не опираться на наличие класса в принятии решений.

    Оба варианта (А/Б) текста можно расположить в разметке:
    <div class="container">
    
      <p class="text" data-text-a="ЭТО СТАРЫЙ ТЕКСТ" data-text-b="ВОТ НОВЫЙ ТЕКСТ"></p>
    
      <div class="btn">ВЫБРАТЬ</div>
    </div>

    Текущее состояние держать в объекте
    const state = {
      isPrimary: true,
      // потом добавятся может ещё свойства
    };

    Отдельно функция render(), которая отрисовывает состояние «на сейчас».
    По кнопке менять состояние и вызывать перерисовку.

    Ответ написан
    Комментировать
  • Как проверить на правильное значение?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    while ('Буратино' !== window.prompt('Как его зовут?!'));
    Ответ написан
    Комментировать
  • Какие методы лучше использовать для получения двух пар ключ \ значения?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно с destructuring assignment примерно так:
    oldArray.map(({prop1, prop2} => ({prop1, prop2}))

    const oldArray = [
      {a: "A1", b: "BB1", prop1: "wanted1", prop2: "dead or alive1", z: "zee1"},
      {a: "A2", b: "BB2", prop1: "wanted2", prop2: "dead or alive2", z: "zee2"},
      {a: "A3", b: "BB3", prop1: "wanted3", prop2: "dead or alive3", z: "zee3"},
      {a: "A4", b: "BB4", prop1: "wanted4", prop2: "dead or alive4", z: "zee4"},
      {a: "A5", b: "BB5", prop1: "wanted5", prop2: "dead or alive5", z: "zee5"},
    ];
    
    const newArray = oldArray.map(({prop1, prop2}) => ({prop1, prop2}));
    // [
    //   {"prop1": "wanted1", "prop2": "dead or alive1"},
    //   {"prop1": "wanted2", "prop2": "dead or alive2"},
    //   {"prop1": "wanted3", "prop2": "dead or alive3"},
    //   {"prop1": "wanted4", "prop2": "dead or alive4"},
    //   {"prop1": "wanted5", "prop2": "dead or alive5"}
    // ]
    Ответ написан
    Комментировать
  • Как сделать разбивку числа?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Логика простая: отрезок нужно случайным образом распилить на N частей.

    Для этого на этот отрезок в случайных неповторяющихся местах нужно положить N - 1 точек разреза.
    Ответ написан
    3 комментария
  • Как настроить одновременный запуск include php?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    хрустальный шар подсказывает (в вопросе-то ничего не указано), что речь идёт о параллельном выполнении нескольких веб-запросов. Это лучше делать с помощью curl_multi()

    В обычном php не много вариантов для параллельных вычислений. Чтобы соединения с базами данных, запросы и прочие операции выполнялись без блокировки, можно посмотреть например, на Swoole – корутины и асинхронные операции в PHP.
    Ответ написан