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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    есть всякие querySelectorAll.forEach(), методы массива .filter()

    Как-то так. Может, кофейку? А то вопрос размыт.
    Ответ написан
  • Как сравнить установленную дату на пк и настоящую?

    в сети для синхронизации времени используется протокол NTP – Network Time Protocol.
    На Хабре есть статья, с реализацией на Python
    Ответ написан
    Комментировать
  • Как создать несколько массивов объектов на основе одного массива объектов?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Создать промежуточный объект-словарь.
    Ключи – префиксы – общие части строк, до точки: "0", "1", "2"...
    Значения – массивы с исходными объектами.
    const results = Object.values(arr.reduce((acc, c) => {
        const prefix = c.id.split('.')[0];
        acc[prefix] = [...acc[prefix] ?? [], c];
        return acc;
      }, {})
    );
    
    /* [
      [{"id":"0"},{"id":"0.0"},{"id":"0.1"},{"id":"0.2"},{"id":"0.3"}],
      [{"id":"1"},{"id":"1.0"},{"id":"1.1"}],
      [{"id":"2"},{"id":"2.0"},{"id":"2.1"},{"id":"2.2"}],
    ] */
    Ответ написан
    Комментировать
  • Как обновлять данные axios после изменения?

    Таски "active" и "ready", вероятно, ничем не отличаются по структуре. Поэтому можно их отдавать с бэка единой кучкой. Добавить каждому флаг isDone (true / false).

    Раскидать их по панелям дашборда можно уже на фронте.

    При изменений флага на фронте, таск мгновенно-реактивно пропадёт из одной и попадёт в другую панельку. Остаётся уведомить бэк о новостях – отправить запрос, ответ на который в данном случае даже можно игнорировать.

    Как реализовать это во Vue — решать вам. Можно прикрутить Vuex и разобраться с глобальным стейтом и мутациями. Можно просто держать массив всех тасков в общем корневом компоненте, в нём же фильтровать активные / готовые и раздавать в дочерние через пропсы. Как из дочерних менять состояние родителей — распространённый вопрос и есть несколько решений. Удачных поисков!

    Если же состояние тасков меняется откуда-то ещё на бэке, т.е. инициатива изменений не в вашем фронте, а на бэке — придётся либо прикручивать сокеты, либо раз в секунду справшивать бэк «есть ли новости?», но это очень плохое решение. Лучше сокеты.
    Ответ написан
    Комментировать
  • Как получить сумму всех элементов массива справа от numbers[i], что бы потом их сравнивать?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Оставить только те элементы массива, что больше суммы всех правее.

    Двигаться справа налево. Накапливать сумму. Сранивать очередной элемент с накопленной суммой.
    const getLeaders = numbers =>
      numbers.reduceRight(
        (acc, c) => { // acc – аккумулятор, c – очередной элемент массива
          if (c > acc.sum) { // если больше суммы тех, что правее
            acc.result.unshift(c); // положить в массив результатов
          }
          acc.sum += c; // накапливать сумму
          return acc; // аккумулятор пойдёт в следующую итерацию
        },
        { result: [], sum: 0 } // начальное значение acc
      )
      .result; // в итоге интересует только массив result
    
    // использование
    getLeaders([16, 17, 5, 4, 3, 1])  // [ 17, 3, 1 ]
    Ответ написан
    3 комментария
  • Как строки в массиве заменить на другие?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const arrA = a[0].trim().split("\n");
    // [ "123", "1234", "12345", "123456" ]
    
    const arrB = b[0].trim().split("\n");
    // [ "a", "b", "c", "d" ]
    
    const arrAB = arrA.map((str, index) => `${arrB[index]}: ${str}`);
    // [ "a: 123", "b: 1234", "c: 12345", "d: 123456" ]
    
    arrAB.join("\n")
    /*
    "a: 123
    b: 1234
    c: 12345
    d: 123456"
    */


    upd. ..и тут вопрос полностью изменили.
    const a = ['123', '1234', '12345', '123456'];
    const b = ['a', 'b', 'c', 'd'];
    
    const replace = (search, a, b) => {
      const result = a.slice(); // копия
      const index = a.indexOf(search);
      if (index > -1) result.splice(index, 1, b[index]);
      return result;
    }
    
    replace('1234', a, b)
    // [ "123", "b", "12345", "123456" ]
    Ответ написан
    2 комментария
  • Как очистить объект?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Удалить все:
    Object.keys(items).forEach(key => delete items[key]);
    Ответ написан
    Комментировать
  • Как сделать условие в Node?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    async requestToSuip(suip, num_oper = '') {
      const exampleData = {
        result: false,
        requisite: "",
        amount: 0,
        created: null,
        suip: null
      };
    
      const url1 = "http://api-1/sber/cashout/suip/" + suip;
      const url2 = "http://api-2/sber/cashout/txnid/" + num_oper;
    
      const {data: data1} = await axios.get(url1);
      const isEqual = Object.keys(exampleData)
        .every(prop => exampleData[prop] === data1[prop]);
      if (isEqual === false) {
        return data1;
      }
      
      const {data: data2} = await axios.get(url2);
    
      return {
        ...data1,
        ...data2, // поля из data2 перезапишут такие же из data1
      };
    }
    Ответ написан
    Комментировать
  • Как в JavaScript менять глобальную переменную внутри функции?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно обращаться к глобальной переменной как к свойству универсального для браузеров / NodeJS / WebWorker'ов объекта globalThis

    function deep() {
      function veryDeep() {
        const inception = () => {
          // во глубине сибирских руд:
          globalThis.myGlobalVar = 'Habr'; // глобализм!
        };
        inception();
      }
      veryDeep();
    }
    deep();
    
    console.log(myGlobalVar); // "Habr"
    Ответ написан
    Комментировать
  • Как сделать чтобы рандом всегда давал новые значения?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Чтобы пореже шли два одинаковых значения подряд, можно перемешивать элементы массива случайным образом, и затем выдавать их последовательно. Когда весь массив исчерпан (ни одного повтора), снова встряхнуть массив и снова начать выдавать элементы по очереди.

    Совсем чуть-чуть заморочиться, и можно сделать, чтобы гарантированно никогда не шло одно и то же "случайное" значение два раза подряд.
    // random order in-place
    const shuffle = array => {
      for (let i = array.length - 1; i > 0; i--) {
        let j = Math.floor(Math.random() * (i + 1)); // random index from 0 to i
        [array[i], array[j]] = [array[j], array[i]];
      }
    };
    
    // init
    let coinIndex = -1;
    
    const button = document.querySelector('.button');
    button.addEventListener('click', () => {
      if (coinIndex < 0) {
        shuffle(coinFlip);
        coinIndex = coinFlip.length - 1;
      }
      console.log(coinFlip[coinIndex]);
      coinIndex--;
    });
    Ответ написан
    2 комментария
  • Как можно улучшить представленный код?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const func = (s, a, b) => Math.max(s.lastIndexOf(a), s.lastIndexOf(b));
    Ответ написан
    1 комментарий
  • Можно ли создать iframe приложение в VK?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    всё так же, называется по-другому

    Создать приложение ВК, Встраиваемое приложение, Игра.
    В Настройках указать «Адрес iFrame»
    скрины
    62669637c5d8a567057429.png

    Настройки, как и раньше:
    626696857d42b498806207.png
    Ответ написан
    3 комментария
  • Как удалить динамически созданный блок?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Удалить динамически создаваемый — искать прямо перед удалением.

    Вроде бы две функции отличаются только назначаемым id?
    const handleClick = id => () => {
      document.querySelector('.container_wrp')?.remove();
      const div = document.createElement('div');
      div.style.width = '700px';
      div.style.height = '500px';
      div.id = id;
      div.classList.add('container_wrp');
      wrpBlock.appendChild(div);
    };
    
    jccBtnJap.addEventListener('click', handleClick('jap_container'));
    jccBars.addEventListener('click', handleClick('stick_container'));
    тут handleClick() возвращает функцию, которая даёт создаваемому элементу переданный id.
    Ответ написан
    Комментировать
  • Являются ли компоненты `ux интерфейсом`?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    UI (user interface) — то, с чем непосредственно взаимодействует User: от фона сайта до кнопок, картинок и надписей.

    UX (user experience) — весь опыт/впечатления пользователя в процессе взаимодействия с брендом: от «впервые услышал от знакомых» до «зашел на сайт, всё понял, удобно нашёл, купил, подписался, обращался за обслуживанием/ремонтом, порекомендовал друзьям».

    Папки в своём проекте можете называть, как считаете нужным. Хорошо бы это было понятно другим разработчикам, которые попытаются разобраться с творением после вас. Вы же напишете исчерпывающую документацию, чтобы UX разработчиков был максимально позитивным? )
    Ответ написан
    Комментировать
  • Почему for..in не работает для коллекции Map?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Документация (только англоязычная версия) вроде бы, исчерпывающе объясняет:
    The for...in statement iterates over all enumerable properties of an object
    that are keyed by strings
    (ignoring ones keyed by Symbols),
    including inherited enumerable properties.


    Ожидаются свойства-строки. Map заточен под другое и позволяет использовать в качестве ключей что угодно, в том числе объекты. Значения добавленные в Map – это не его свойства в привычном смысле.

    Map, как и «всё в JavaScript» — объект. Поэтому можно взять и назначить ему свои свойства. Вот они вполне себе попадут в перечислёж for..in:
    const m = new Map();
    m.set({}, 'obj');
    m.set('a', 'A');
    
    // это другое
    m.b = 'B';
    
    for (let prop in m) {
      console.log('property', prop);
    }
    
    // property b
    Ответ написан
    Комментировать
  • Где взять минимальный дешевый DBaaS (DB as a Service)?

    В облаке Mail ru (посмотрел) 1800 руб/мес минимальный инстанс MySQL.
    Определённо дешевле можно взять минимальную VPS'ку где-то.
    Ответ написан
    Комментировать
  • Можно ли на маке запустить одновременно одно и тоже приложение скаченное через эпстор?

    Обычное приложение для мака можно запустить несколько раз: в терминале open -n "/Applications/Calculator.app" – каждое выполнение запустит новую копию Калькулятора для примера.

    Но ТС хочется запустить приложение для iOS, какой-то там покер-рум. Приложеньки iOS можно запускать на процессоре M1. Но трюк с множественными инстансами одного приложения — не поддерживается.
    Ответ написан
    2 комментария
  • Делаю SDK. Как объяснить пользователю, иммутабельный геттер или мутабельный?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Объект кота не в курсе требований иммутабельности стейта. Поэтому эти пляски лучше отложить туда же, где требуется иммутабельность.

    Как вариант, использовать immer, чтобы менять глубокие свойства, не беспокоясь об иммутабельности:
    import produce from "immer"
    
    const nextState = produce(this.state, draft => {
      // тут можно всё менять, не беспокоясь об иммутабельности
      const { catValue } = draft;
      catValue.cat.colors = Color.BLACK;
    });
    
    this.setState(nextState);
    или не весь стейт
    import produce from "immer"
    
    const { catValue } = this.state;
    const nextCatValue = produce(catValue, draft => {
      // тут можно всё менять, не беспокоясь об иммутабельности
      catValue.cat.colors = Color.BLACK;
    });
    
    this.setState({ catValue: nextCatValue });
    Ответ написан
  • Что лучше, развернуть фронтенд и бакенд на одном домене или разных субдоменах?

    sergiks
    @sergiks Куратор тега Веб-разработка
    ♬♬
    находясь на едином домене, фронт и бэк беспричинно оказываются «связаны» как минимум общей точкой входа.

    Если их развязать, разместив на разных поддоменах, это позволит, например, независимо переезжать с сервера на сервер только бэку; или перенести статичный фронт на CDN, не трогая бэк.
    Ответ написан
    1 комментарий
  • Как скопировать прослушиватели событий с одно элемента на другой без jquery?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    cloneNode() сработает только если слушатели прописаны прямо в атрибутах элемента <a onclick="alert('Habr')">click me</a>

    Слушатели, добавленные элементу через addEventListener() скопировать можно примерно никак.

    Так что лучше держать обработчик отдельно, и навешивать их на элементы по мере надобности:
    function myClickHandler(event) {
      // что-то сделать по поводу клика
    }
    
    element1.addEventListener('click', myClickHandler);
    element2.addEventListener('click', myClickHandler);
    element3.addEventListener('click', myClickHandler);

    Или же слушать события выше по дереву, на общем родителе:
    <div id="parent">
      <button>1</button>
      <button>2</button>
      <button>3</button>
    </div>
    и слушать клики на div#parent
    Ответ написан
    Комментировать