Задать вопрос
Ответы пользователя по тегу JavaScript
  • Как сократить/улучшить этот код?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    document.addEventListener(
      'click',
      (e) => {
        const target = e.target.closest('.media-category__item');
        if (!target) {
          return;
        }
        document.querySelector('.media-category__item.active')?.classList.remove('active');
        target.classList.add('active');
        document.querySelector('.media-tab.active')?.classList.remove('active');
        document.querySelector(`.media-tab[data-tab="${target.dataset.category}"]`)?.classList.add('active');
      },
    );
    Ответ написан
    7 комментариев
  • Как передать функцию в компонент через родителя во vue.js?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Я бы построил по другому принципу. Каждая страница - отдельный компонент, переключаемый через vue-router. В хидер передаётся описание кнопок. При нажатии на кнопку хидер генерирует событие с идентификатором кнопки. Страница обрабатывает событие, получает новые данные и передаёт их в контент.
    <page-following>
      <page-header
        title="Following"
        :buttons="buttons"
        @buttonPressed="onButtonPressed"
      />
      <!-- здесь контент -->
      <page-footer />
    </page-following>
    Ответ написан
    2 комментария
  • Как получить путь к файлу из input type="file"?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    IMHO, никак. Доступ к реальной файловой системе из js-скрипта в браузере сильно ограничен. Максимум - получить реальное имя без полного пути и временное служебное имя вида blob:null/8d02a1cb-72bc-4026-a4f7-d5f1c5d08bce.

    P.S. Странное имя функции "добавить неудачу".
    Ответ написан
    Комментировать
  • Как найти ближайшую дату в массиве?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    const parseDate = (date) => Date.parse(date.split('/').reverse().join('-'));
    const findClosest = (list, date = (new Date()).toLocaleDateString('en-GB')) => {
      const findDate = parseDate(date);
      return list.reduce(
        (acc, cur) => {
          const delta = parseDate(cur.date) - findDate;
          return (delta >= 0 && delta < acc.delta) ? { delta, el: cur } : acc;
        },
        { delta: Number.MAX_SAFE_INTEGER, el: null },
      ).el;
    };
    Ответ написан
    Комментировать
  • Глубокое сравнение объектов JS?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Хорошо работает, говорите?
    deepEqual({a: 1}, {b: 1}); // true
    deepEqual(null, {b: 1}); // 1
    deepEqual({a: 1, b: 2}, {b: 2, a: 1}); // false

    Моё решение

    const deepEqual = (a, b) => {
      if (a === b) {
        return true;
      }
      if (a === null || b === null || typeof a !== 'object' || typeof b !== 'object') {
        return false;
      }
      const aKeys = Object.keys(a);
      const bKeys = Object.keys(b);
      if (aKeys.length !== bKeys.length) {
        return false;
      }
      for (let i = 0; i < aKeys.length; i += 1) {
        const key = aKeys[i];
        if (!bKeys.includes(key) || !deepEqual(a[key], b[key])) {
          return false;
        }
      }
      return true;
    };

    Ответ написан
  • Циклы, рекурсия и массивы в JAVASCRIPT?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    arrayToList - а точно список должен формироваться в обратном порядке? Если да, то почему listToArray формирует в прямом?
    listToArray(arrayToList([1, 2, 3])); // Array(3) [ 3, 2, 1 ]

    Функция prepend работает неправильно, переворачивая исходный список.
    const list = {
      value: 2,
      rest: {
        value: 3,
        rest: null,
      },
    };
    prepend(1, list);
    /* 
    Object {
      value: 1,
      rest: Object {
        value: 3,
        rest: Object {
          value: 2,
          rest: null
        }
      }
    }
    */

    Рекурсивные варианты

    const arrayToList = (arr, idx = 0) => ({
      value: arr[idx],
      rest: idx === arr.length - 1
              ? null
              : arrayToList(arr, idx + 1)
    });
    const listToArray = (list) => (
      list.rest === null
        ? [list.value]
        : [list.value, ...listToArray(list.rest)]
    );
    const prepend = (value, rest) => ({ value, rest });
    const nth = (list, idx) => (
      idx === 0
        ? list.value
        : (
          list.rest === null
            ? undefined
            : nth(list.rest, idx - 1)
        )
    );


    Нерекурсивные варианты

    const arrayToList = (arr) => {
      const list = null;
      for (let i = arr.length - 1; idx >= 0; idx -= 1) {
        list = { value: arr[idx], rest: list };
      }
      return list;
    };
    const listToArray = (list) => {
      const arr = [];
      while (list !== null) {
        arr.push(list.value);
        list = list.rest;
      }
      return arr;
    };
    const prepend = (value, rest) => ({ value, rest });
    const nth = (list, idx) => {
      while (list !== null) {
        if (idx === 0) {
          return list.value;
        }
        idx -= 1;
        list = list.rest;
      }
    };

    Ответ написан
    Комментировать
  • Всегда ли внутри условного оператора команды выполняются последовательно?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Это требование стандарта. Соблюдается ли оно конкретным интерпретатором JS - это вопрос к разработчикам интерпретатора. Можете проверить самостоятельно
    const test = (x) => { console.log(x); return false; };
    if (test(1) && test(2)) {
      console.log('???');
    }
    Ответ написан
    5 комментариев
  • Как оптимизировать запись?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    order.status != 7 || place.importance != 1
    Ответ написан
    Комментировать
  • Как сделать чтобы значение инпута не округлялось при увеличении уменьшении?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Писать свой кастомный контрол с выводом значения как строки через toFixed()
    Ответ написан
    Комментировать
  • Как писать асинхронный код?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Используйте событие transitionend
    Ответ написан
    Комментировать
  • Какой бы код вы выбрали?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    function clockTick() {
      const date = new Date();
    
      electricDate.innerHTML = `${date.toLocaleDateString('en-CA')} ${date.toLocaleString('ru-RU', {weekday: 'short'}).toUpperCase()}`;
      electricTime.innerHTML = date.toLocaleTimeString();
    }
    Ответ написан
    Комментировать
  • Не получается реализовать систему с map?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Метод map вызывает callback-функцию для каждого элемента массива.
    Если массив пустой (arr.length === 0), то элементов в нём нет по определению.
    Соответственно, callback-функция не будет вызвана ни одного раза.
    Ответ написан
    2 комментария
  • Как установить событие на будущий DOM элемент?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Для контроля изменений DOM используйте MutationObserver. В данном случае вам надо установить опцию childList для слежения за потомками div'а и, если добавление элементов происходит не непосредственно в div, а в его потомка, то ещё и опцию subtree.
    Ответ написан
    Комментировать
  • Как найти слово по буквам?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    const words = ['Азбука', 'Ананас', 'Зелень'];
    const letters = 'аБ'.toLowerCase().split('');
    const result = words.filter(
      (word) => {
        const lWord = word.toLowerCase();
        return letters.every((letter) => lWord.includes(letter))
      }
    );
    console.log(result);
    // Array [ "Азбука" ]
    Ответ написан
    Комментировать
  • Почему рандомные элементы в массиве повторяются?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Жуть. Вы создаёте элемент массива, потом проверяете, есть ли в массиве этот элемент, и если есть (а он там всегда есть, элемент массива всегда есть в этом массиве), но не последний (а каким ему быть, если его добавили только что), то удаляете все элементы массива и снова добавляете только что созданный.
    const NAMESS = [];
    while (NAMESS.length < 8) {
      const rand = `${NAMES[random(0, NAMES.length - 1)]} ${SURNAMES[random(0, SURNAMES.length - 1)]}`;
      if (!NAMESS.includes(rand)) {
        NAMESS.push(rand);
      }
    }
    Ответ написан
    4 комментария
  • JS Hook возвращает undefined.. Что не так делаю?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Так у вас из функции run_js_lib ничего не возвращается, она просто вызывает хуки с заданными параметрами, никак не используя полученный результат.
    Ответ написан
  • Как получить массив дат со следующими пятью днями?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    [0, 1, 2, 3, 4].map(
      (shift) => {
        const date = new Date();
        date.setDate(date.getDate() + shift);
        return date.toLocaleDateString('en-CA');
      }
    );
    // Array(5) [ "2022-03-28", "2022-03-29", "2022-03-30", "2022-03-31", "2022-04-01" ]

    const date = new Date();
    const dates = [];
    for (i = 0; i < 5; i += 1) {
      dates.push(date.toLocaleDateString('en-CA'));
      date.setDate(date.getDate() + 1);
    }
    console.log(dates);
    // Array(5) [ "2022-03-28", "2022-03-29", "2022-03-30", "2022-03-31", "2022-04-01" ]
    Ответ написан
    3 комментария
  • Какой функцией декодировать эту строку - чтобы русские буквы получились?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    JSON.parse('"\u042d\u0442\u043e \u0442\u0435\u043a\u0441\u0442 \u043a\u043e\u0442\u043e\u0440\u044b \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0439 \u0444\u0438\u0433\u043d\u0451\u0439 \u0437\u0432\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u0431\u043e\u0433 \u0437\u043d\u0430\u0435\u0442 \u043a\u0430\u043a \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u043c"');
    // Это текст которы непонятной фигнёй звкодирован и бог знает как его обратно сделать нормальным
    Ответ написан
    Комментировать
  • VUE: Как можно менять значение в data с задержкой в одну секунду перебирая массив из data?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вы не понимаете, как работает setTimeout. Эта функция не останавливает выполнение кода, а создаёт в отдельном потоке таймер, который через заданное время положит вызов callback-функции в очередь выполнения JS. В результате вы практически одновременно создаёте все таймеры, и они одновременно срабатывают.
    Для циклических вещей используется либо рекурсивный вызов setTimeout, либо, что гораздо лучше, setInterval.
    onStart() {
      let idx = 0;
      const timer = setInterval(
        () => {
          this.step = this.myList[idx];
          idx += 1;
          if (idx >= this.myList.length) {
            clearInterval(timer);
          }
        },
        1000,
      );
    }
    Ответ написан
    3 комментария
  • Задачка на массивы и циклы JS?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    const reverseArray = (arr) =>
      arr.reduceRight((acc, item) => (acc.push(item), acc), []);
    
    const reverseArrayInPlace = (arr) => {
      for (let i = 0, j = arr.length - 1; i < j; i += 1, j -= 1) {
        [arr[i], arr[j]] = [arr[j], arr[i]];
      }
    };
    Ответ написан
    3 комментария