Задать вопрос
  • Как поменять местами элементы в списке стран?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    У элементов, которые надо переставить, похоже, одинаковый принцип формирования id:
    "t-phonemask_" и двухбуквенный код страны.

    Нашли элемент очередной страны, переставили в начало. Т.к. вставляются в самое начало общего родителя, надо пройтись по списку переставляемых в обратном порядке.

    В исходной разметке эти элементы отсутствуют — подгружаются/формируются динамически. Поэтому запускать перестановку надо не сразу, а после формирования менюшки. Проще всего, но ненадёжно – через таймаут.
    const sortUp = () => {
      const parent = document.querySelector('div.t-input-phonemask__options-wrap > noindex');
      const goFirst = ['ru', 'ua', 'kz'];
      goFirst.reverse().forEach(cc => {
        parent.insertAdjacentElement('afterbegin', parent.querySelector('#t-phonemask_' + cc));
      });
    };
    setTimeout(sortUp, 1000);
    P.S. стоит Тильде чуть что-то поменять, изменить названия классов — перестанет работать.
    Ответ написан
  • Как ограничить количество совпадений одинаковых цифр в регулярном выражении?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Напоминалка
    Количество задаётся в фигурных скобках {n,m}.
    Например, /5{1,3}/ соответствует цифре 5 повторяющейся от 1 до 3 раз.
    Жадно. Т.е. если можно взять три – возьмёт три. Подробнее про квантификаторы (указатели количества).

    Решение
    ​const re = /(([1-68])\2{0,2}|([79])\3{0,3}|0)/g;
    
    ​"443777771999990005555551".match(re).join(', ')
    // "44, 3, 7777, 7, 1, 9999, 9, 0, 0, 0, 555, 555, 1"

    Расшифровка
    В круглых скобках через вертикальную черту – варианты:
    (A|B|C) == "A" ИЛИ "B" ИЛИ "C"

    В квадратных скобках наборы символов:
    [a-z] == любой один от "a" до "z"
    В данном случае:
    [1-68] == цифра от 1 до 6 или 8

    \2 или например \3 – отсылка к ранее захваченному в круглых скобках фрагменту
    /([79])\2{0,2}/ цифра 7 или 9. Сразу после неё – её же повтор от 0 до 2 раз. Т.е. в сумме это цифра 7 или 9, идущая до 3 раз подряд.
    Ответ написан
    6 комментариев
  • Почему html не вставляется с помощью js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Попробуйте заменить кавычки на обратные `:
    $('#bombfire').html(`
    <svg>...</svg>
    `);
    Только в обратных "бэк-тиках" можно текст разбивать на строки. Подробнее про строки и кавычки.

    В обычных одинарных кавычках, как у вас, новую строку надо бы предварять обратным слешем:
    const str = ' \
      line 1 \
      line 2 \
    ';
    Ответ написан
    1 комментарий
  • Как нейросети обрабатывают текстовую информацию?

    Слова исходного текста можно представить через "one-hot encoding" – одномерный вектор, где только 1 бит для данного слова – включён. Сколько всего в тексте уникальных слов, такой длины векторы.
    пример
    [ 1, 0, 0, 0, 0 ] Как
    [ 0, 1, 0, 0, 0 ] нейросети
    [ 0, 0, 1, 0, 0 ] обрабатывают
    [ 0, 0, 0, 1, 0 ] текстовую
    [ 0, 0, 0, 0, 1 ] информацию

    Далее возможны преобразования слов в многомерные векторы так, что слова со сходными смыслами оказываются рядом. Или вектор от "кошка" к "котёнок" оказывается параллелен и той же длины, что от "собака" к "щенок". Это называется "word embedding". Один из способов их построения называется "Word2Vec".
    Ответ написан
    Комментировать
  • Где ошибка в удалении дубликатов в массиве?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Ошибки:
    1. когда удаляется один элемент из массива, текущее значение i уже начинает указывать на следующий,
      но цикл for() увеличит i ещё на 1, и получится, что 1 элемент пропустили. Чинится уменьшением i на 1 сразу после удаления 1 элемента.
    2. верхнее значение i должно быть не меньше-или-равно, а меньше, чем длина массива.
    3. если текущий элемент дубль, то его индекс НЕ равен indexOf(value)

    Вот так работает:
    const duplicateArray = ['a', 'b', 'c', 'a', 'b', 'c', 'q'];
    
    function funcDeleteDuplicate(array) {
      for (let i = 0; i < array.length; i++) {
        if (array.indexOf(array[i]) !== i) {
          array.splice(i, 1);
          i--;
        }
      }
      return array;
    }
    console.log(funcDeleteDuplicate(duplicateArray));
    // [ "a", "b", "c", "q" ]


    Лучше:
    Когда речь об уникальных значениях, удобнее использовать Set — это коллекция, которая сохраняет только уникальные значения. Такой вариант хорош ещё тем, что не изменяет исходный массив.
    const funcDeleteDuplicate = array => [...new Set(array)];
    Ответ написан
    Комментировать
  • Как сделать коллбэк функцию?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Колбэки и так уже используются: вот тут imageClone.onload = imageLoaded;

    Некую функцию (колбэк == "callback" == "перезвоните сюда позже") передали, чтобы её вызвали позже. Когда наступит событие onLoad у этого клона картинки.

    Как-то так попробуйте:
    function nextActions() {
      vars();
      anim();
      slider();
    }
    
    // ... 
    
    // внутри колбэка imageLoaded:
    if (!preloader.classList.contains('done')) {
      preloader.classList.add('done');
      nextActions(); // запустить следующие анимации
    }
    Ответ написан
    Комментировать
  • Какие есть либы, чтобы сделать горизонтальную лоторею?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    ну вот пример чей-то

    Ответ написан
    Комментировать
  • Как реализовать правильное поведение удаления всех данных из localStorage?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Стоит что-то выбрать как «единственный источник правды». Например, тот же localStorage.
    Тогда все функции будут сначала брать из LS массив машин (или пустой массив).

    jsFiddle
    Ответ написан
    3 комментария
  • Почему выводится NaN в данном случае?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Так не будет работать.
    Вы через PHP забираете статичный HTML той страницы. Элемент с классом tv-symbol-price-quote__value js-symbol-last там — пустой. Это после обработки в браузере JS, в тот элемент попадает обновляемое значение котировки.

    Обновления, вроде бы, приходят по постоянному WebSocket соединению.
    Ответ написан
    4 комментария
  • Merge Two Sorted Lists задача- почему на Leetcode выдается ошибка при моем решении?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    в задании по ссылке речь не о массивах с целыми. Они только для упрощённого примера.
    Там описана структура
    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode() : val(0), next(nullptr) {}
     *     ListNode(int x) : val(x), next(nullptr) {}
     *     ListNode(int x, ListNode *next) : val(x), next(next) {}
     * };
     */
    Ответ написан
  • Насколько правильный код?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Ошибка:
    Не правильно, что backBlock.addEventListener добавляется внутри обработчика клика. Т.е. каждый раз, как нажимаем на openBlock, вешается ещё и ещё один обработчик на backBlock. Достаточно один раз, заранее, так же как сейчас openBlock.addEventListener

    Мелочи:
    1. openBlock и backBlock не меняются, их можно вместо let объявить const
    2. внутри обработчиков событий снова и снова искать document.querySelector('.hidden-block') наверное, не имеет смысла, достаточно один раз, заранее
      const hiddenBlock = document.querySelector('.hidden-block');
      и далее обращаться к этой константе hiddenBlock.

    Культура:
    Хорошо бы песочницу на CodePen, где можно вживую проверить работу этого кода. И вставить её в сам вопрос, через кнопку [ + ]
    Ответ написан
    Комментировать
  • Как удалить элементы не кратные 4, если знаем их количество?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Понять, сколько нужно удалить – остаток от деления длины на 4: length % 4
    Выбрать все, взять из массива хвост длиной с этот остаток, и каждого .remove()
    Ответ написан
    2 комментария
  • Как удалить объекты с одинаковым id?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    // вместо
        price = price.filter(
          (i) => i.id !== id
        );
    
    // попробуйте
      const priceIndex = price.findIndex(({ id: priceId }) => priceId === id);
      if (priceIndex > -1) price.splice(priceIndex, 1);
    и будет удаляться только один из price, первый попавшийся с соотв. id.
    Ответ написан
  • Не понимаю пока еще работу с this, что тут надо сделать?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    pet_1 = { name: "Шарик", age: 10 };
    pet_2 = { name: "Жучка", age: 5 };
    
    function getName() {
      return [this.name, this.age].join(' ');
    }
    
    pet_1.getName = getName;
    pet_2.getName = getName;
    
    pet_1.getName(); // Шарик 10
    pet_2.getName(); // Жучка 5


    Или вот раздача бесплатных примесей (mixin) через Object.assign():
    mixin
    pet_1 = { name: "Шарик", age: 10 };
    pet_2 = { name: "Жучка", age: 5 };
    
    function getName() {
      return [this.name, this.age].join(' ');
    }
    
    const mixin = { getName };
    
    Object.assign(pet_1, mixin);
    Object.assign(pet_2, mixin);
    
    pet_1.getName(); // Шарик 10
    pet_2.getName(); // Жучка 5
    Подготовить объект с единственным свойством "getName" в котором лежит одноимённая функция. Скопировать все свойства (в данном случае одно) этого объекта поверх существующих свойств объектов pet_1 и pet_2 с помощью Object.assign().
    Ответ написан
    Комментировать
  • Как из двух разных видов массива получить один?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вариант с reduce() в копилку:
    const zip = (arr1, arr2) => arr1.reduce(
      (acc, head, i) => (acc.push({ ...arr2[i], head }), acc),
      []
    );

    Использование:
    zip(mass1, mass2) 
    /* [
      { t1: "aa", p1: "lot", head: "zn1" },
      { t1: "ab", p1: "kot", head: "zn2" },
      { t1: "ac", p1: "mot", head: "zn3" },
    ] */

    Конечно, map() тут больше подходит:
    mass1.map((head, i) => ({ head, ...mass2[i] }))
    Ответ написан
    1 комментарий
  • Можно ли выполнять сценарий после полной загрузки страницы?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно завести флаги, отслеживающие, загружено ли уже окно, и второй – пытались ли уже выполнить
    window.isLoaded = false;
    window.addEventListener('load', () => {
      window.isLoaded = true;
    });
    
    window.isQueued = false; // уже ждём в очереди?
    function nowOrLater() {
      if (!window.isLoaded) {
        if (!window.isQueued) {
          window.addEventListener('load', nowOrLater);
          window.isQueued = true;
        }
        return;
      }
     
      // тут код котовый выполнить только после 
    }
    Ответ написан
    3 комментария
  • Как стилизовать react функцию с помощью styled-components?

    Посмотрел их документацию. Там приводят пример именно с обёрткой в заготовленный стилизованные тег.

    Т.е. «сам» компонент не стилизуют.

    const Main = styled.main`
      background-color: black;
      height: 100vh;
    `
    
    function App(props) {
      const { message } = props;
      return (
        <Main>
          <div className="App">
            {message}
          </div>
        </Main>
      );
    }
    Ответ написан
    1 комментарий
  • Как подавить генерацию события 'scroll' при использовании 'scrollIntoView'?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    пара идей, не проверял:

    1. держать переменную-флаг, которую выключать на время, при запуске scrollIntoView():
    let isScrollIgnored = false;
    
    const myScroll = () => {
      if (isScrollIgnored) return;
      // ...
      isScrollIgnored = true;
      setTimeout(() => isScrollIgnored = false, 500);
      someElement.scrollIntoView();
      // ...
    };
    
    window.addEventListener( 'scroll', myScroll );


    2. [upd.: нерабочий вариант] проверять свойство isTrusted у события scroll: может, когда оно вызвано не мышкой, а scrollIntoView(), то становится false? Тогда:
    const myScroll = event => {
      const { isTrusted } = event;
      if (!isTrusted) return;
      // ...
    Ответ написан
  • Не могу понять в чем проблема в коде, где ошибка?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    С редьюсом перемудрили, кажется:
    «если есть антоним текущему шагу, то удаляем антоним» – эт зачем нам?
    Текущий шаг "E", удаляем найденный "W". Но для чего? Их надо парами удалять, тогда уж. А так текущий шаг "E" остаётся в массиве и создаёт дисбаланс.

    Вроде всё просто: надо посчитать пары и убедиться что число E равно числу W, а число N равно числу S. Всего-то.

    P.s. строку можно упростить:
    - if (walk.length > 10 || walk.length < 10) return false;
    + if (walk.length !== 10) return false;

    spoiler
    const isValidWalk = walk => {
      if (walk.length !== 10) return false;
      const counts = walk.reduce((acc, c) => (acc[c]++, acc), { w: 0, n: 0, e: 0, s: 0 });
      return counts.e === counts.w && counts.n === counts.s;
    };
    Ответ написан
    4 комментария
  • Как создать функцию которая возвращает рандомный массив?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В коде в вопросе забыли вернуть полученный массив из функции:
    const randomArr = () => {
      // ...
    
      return arr;
    };


    Как в вопросе, 10 элементов, случайные целые от 0 до 10:
    const randomArr = () => Array.from({length: 10}, () => (Math.random() * 10) | 0);
    // [ 0, 3, 2, 4, 2, 1, 1, 5, 2, 5 ]
    Так не исключены повторы значений.

    Если же хочется непременно уникальных, взять массив [1, 2, ... 10] и случайно перемешать их:
    const randomArr = () => {
      const arr = Array.from({length: 10}, (_, i) => i + 1); // [1, 2, .. 10]
      for (let i = 0; i < 10; i++) {
        const j = i + Math.floor(Math.random() * (10 - i));
        [arr[i], arr[j]] = [arr[j], arr[i]]; // местами поменять
      }
      return arr;
    }
    // [ 6, 7, 9, 3, 1, 8, 10, 2, 4, 5 ]
    Ответ написан
    2 комментария