Задать вопрос
Ответы пользователя по тегу JavaScript
  • Как получить два символа с конца без использования slice?

    0xD34F
    @0xD34F Куратор тега JavaScript
    `${value % 100}`.padStart(2, 0)

    или

    /..?$/.exec(value)[0]

    или

    ('' + value).replace(/.+(?=..)/, '')

    или

    String(value).split(/(?=.{2})/).pop()

    или

    [...''.concat(value)].splice(-2).join('')
    Ответ написан
    Комментировать
  • Как правильно реализовать скрипт на jquery?

    0xD34F
    @0xD34F Куратор тега JavaScript
    $('селектор родительских элементов инпутов')
      .last()
      .clone()
      .find('input')
      .attr('name', (i, name) => name.replace(/(?<=\[)\d+(?=\])/, m => +m + 1))
      .end()
      .appendTo('кому-то там добавляется, сами разберётесь кому');

    https://jsfiddle.net/43kv5pwj/

    UPD. Вынесено из комментариев:

    На IOS не работает (safari)

    name.replace(/\[(\d+)\]/, (m, g1) => `[${+g1 + 1}]`)
    Ответ написан
  • Как загружать на страницу посты с одинаковым id?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const groupedPosts = Object.values(data.reduce((acc, n) => (
      (acc[n.id] ??= []).push(n),
      acc
    ), {}));
    
    const button = document.querySelector('button');
    button.addEventListener('click', showPosts);
    
    const SHOW_POSTS_GROUPS = 2;
    for (let i = 0; i < SHOW_POSTS_GROUPS; i++) {
      showPosts();
    }
    
    function showPosts() {
      const posts = groupedPosts.shift();
      if (posts) {
        const html = `<ul>${posts.map(n => `<li>${n.name}</li>`).join('')}</ul>`;
        document.querySelector('.card__wrap').insertAdjacentHTML('beforeend', html);
        button.disabled = !groupedPosts.length;
      }
    }
    Ответ написан
  • Как сделать range slider который будет изменяться по клику на кнопку?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const interval = [ 0, 150 ];
    
    const $slider = $('#storlekslider').slider({
      range: 'max',
      min: interval[0],
      max: interval[1],
      step: 1,
      slide: (e, ui) => update(ui.value),
    });
    
    const $input = $('#storlek_testet').on('input', e => update(e.target.value));
    
    $('button').click(e => update(+$input.val() + 50 * ($(e.target).text() === '+' ? 1 : -1)));
    
    
    function update(val) {
      val = Math.max(interval[0], Math.min(interval[1], val));
      $input.val(val);
      $slider.slider('value', val).find('.ui-slider-handle').text(val);
    }
    Ответ написан
    Комментировать
  • Как перебрать объекты с вложенностью?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Чтобы дальше два раза одно и то же не писать, небольшой декоратор:

    const processNonEmptyObjectOnly = (f, defaultResult) =>
      data => (
        data = data instanceof Object ? Object.entries(data) : [],
        data.length ? f(data) : defaultResult
      );

    Собираем разметку:

    const createTreeHTML = processNonEmptyObjectOnly(data => `
      <ul>${data.map(n => `
        <li>
          ${n[0]}
          ${createTreeHTML(n[1])}
        </li>`).join('')}
      </ul>`
    , '');
    
    document.body.insertAdjacentHTML('beforeend', createTreeHTML(data));

    Или, создаём элементы напрямую:

    const createTreeElement = processNonEmptyObjectOnly(data =>
      data.reduce((ul, [ k, v ]) => (
        ul.append(document.createElement('li')),
        ul.lastChild.append(k),
        (v = createTreeElement(v)) && ul.lastChild.append(v),
        ul
      ), document.createElement('ul'))
    , null);
    
    document.body.append(createTreeElement(data));
    Ответ написан
    Комментировать
  • Функция jQuery.fn.load() is deprecated?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Что-то не понимаете - первым делом следует заглянуть в документацию:

    Note: This API has been removed in jQuery 3.0; please use .on( "load", handler ) instead of .load( handler ) and .trigger( "load" ) instead of .load()
    Ответ написан
    Комментировать
  • Как получить первые и последние слова всех строк текста?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const result = str.split('\n').reduce((acc, n) => (
      n && (n = n.split(' '), acc.push([ n[0], n[~-n.length] ])),
      acc
    ), []);

    или

    const result = Array.from(
      str.matchAll(/(?=.*(^\S+))(?=.*?(\S+$))/gm),
      n => n.slice(1)
    );
    Ответ написан
    Комментировать
  • Как отфильтровать объекты из массива по id?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Группируем данные:

    const grouped = Object.entries(arr.reduce((acc, n) => (
      (acc[n.id] ??= []).push(n.name),
      acc
    ), {}));

    Затем собираем html:

    document.body.insertAdjacentHTML('beforeend', grouped
      .map(([ k, v ]) => `
        <ul id="list-${k}">${v.map(n => `
          <li>${n}</li>`).join('')}
        </ul>`)
      .join('')
    );

    Или напрямую создаём элементы:

    document.body.append(...grouped.map(([ id, names ]) => {
      const ul = document.createElement('ul');
      ul.id = `list-${id}`;
    
      ul.append(...names.map(n => {
        const li = document.createElement('li');
        li.textContent = n;
        return li;
      }));
    
      return ul;
    }));
    Ответ написан
    Комментировать
  • Как скрыть часть телефонного номера звездочками?

    0xD34F
    @0xD34F Куратор тега JavaScript
    str.replace(/\d{3}-\d{2}/, '***-**')
    // или
    str.slice(0, 9) + '***-**' + str.slice(15)
    // или
    str.replace(/\d(?=\d*-)/g, '*')
    // или
    str.replace(/\d+(?=-)/g, m => '*'.repeat(m.length))
    // или
    str.replace(/(?<=\) ).{6}/, '***-**')
    // или
    str.match(/^.{9}|.{3}$/g).join('***-**')
    Ответ написан
    1 комментарий
  • Почему не работает сортировка массива?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Вы не понимаете,...

    • ...как работают условные операторы:

      if (sortArray[i]) {

      Что если там 0? Тогда этот элемент обработан не будет - не попадёт в результирующий массив. О чём, кстати, и говорится в сообщении об ошибке, в возвращаемом вами отсортированном массиве элементов меньше, чем в исходном:

      expected [ Array(14980) ] to deeply equal [ Array(15000) ]

    • ...когда условные операторы следует применять - первый не нужен, элемент с индексом i всегда существует, так что засовывать в firstArray его следует без проверок.
    • ...как, имея индекс, проверить наличие соответствующего элемента в массиве.

    Исправленный вариант вашего кода.

    function pendulum(arr) {
      arr.sort((a, b) => a - b);
    
      const head = [];
      const tail = [];
    
      for (let i = 0; i < arr.length; i += 2) {
        head.push(arr[i]);
    
        if (i + 1 < arr.length) { // или if (arr.hasOwnProperty(i + 1)) {
          tail.push(arr[i + 1]);
        }
      }
    
      return [ ...head.reverse(), ...tail ];
    }


    А вообще, не надо тут никаких if'ов.
    const pendulum = arr => arr
      .sort((a, b) => a - b)
      .reduce((acc, n, i) => (acc[i & 1].push(n), acc), [ [], [] ])
      .flatMap((n, i) => i ? n : n.reverse());
    Ответ написан
    Комментировать
  • Как правильно удалять строки из таблицы?

    0xD34F
    @0xD34F Куратор тега JavaScript
    href="javascript:deleteRow(this);"

    Замените на onclick="deleteRow(this)".

    Или, просто уберите, и сделайте делегированный обработчик клика:

    document.querySelector('table').addEventListener('click', e => {
      e.target.closest('.btn')?.closest('tr').remove();
    });

    нашел другой вариант

    $('body').on('click', 'btn btn-warning', function() {
            $(this).parents('tr').remove();
        });


    НО проблема в том, что при нажатии удаляется полностью все строки, которые...

    Это не "вариант", а неработоспособный мусор - где точки перед именами классов?

    Что до удаления строк - этого не происходит. А вот страница перезагружается. Потому что href у ссылки пустой и не отменяете действие по умолчанию при клике. Надо так:

    $('table').on('click', '.btn.btn-warning', function(e) {
      e.preventDefault();
      $(this).closest('tr').remove();
    });

    Или, вместо пустой строки записывайте # ссылкам в href. Или, замените a на span, и стилизуйте его под ссылку:

    span.btn {
      text-decoration: underline;
      color: blue;
      cursor: pointer;
    }
    Ответ написан
    Комментировать
  • Как добавить генератор символа в строке, через каждые N символов?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const getStr = length => Array
      .from({ length }, n => (
        n = Array(length).fill('.'),
        n[Math.random() * length | 0] = 'Q',
        n.join('')
      ))
      .join('\n');
    Ответ написан
    Комментировать
  • Почему не выводит правильно информацию о погоде?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Потому что передаёте в sendRequesr вместо строки с городом соответствующий ей элемент <a>.
    Ответ написан
    3 комментария
  • Как установить значение в select multiple используя jquery?

    0xD34F
    @0xD34F Куратор тега JavaScript
    {"value":"[\"2b2df5f4-256d-402e-b074-c460ee394a2e

    Двойные кавычки перед [ видите? - value (days тоже) это строка, а не массив. Так что не хватает JSON.parse.
    Ответ написан
    1 комментарий
  • Как создать двухмерный массив данные из нескольких input JS?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Сколько tbody у таблицы? Одна штука:

    document.querySelector('tbody').addEventListener('input', function() {
      const data = Array.from(
        this.children,
        tr => Array.from(tr.querySelectorAll('input'), input => input.value)
      );
    
      console.log(data);
    });

    Несколько:

    document.querySelector('table').addEventListener('input', e => {
      const { map, flatMap } = Array.prototype;
      const data = flatMap.call(
        e.currentTarget.tBodies,
        tbody => map.call(
          tbody.rows,
          tr => map.call(tr.cells, td => td.lastElementChild.value)
        )
      );
    
      console.log(data);
    });
    
    // или
    
    document.querySelector('table').addEventListener('input', function() {
      const numHeadRows = this.querySelectorAll('thead tr').length;
      const data = [];
    
      for (const input of this.querySelectorAll('tbody input')) {
        const td = input.parentNode;
        const iCol = td.cellIndex;
        const iRow = td.parentNode.rowIndex - numHeadRows;
        (data[iRow] ??= [])[iCol] = input.value;
      }
    
      console.log(data);
    });
    Ответ написан
    4 комментария
  • Как удалить одинаковые элементы но оставить один из них?

    0xD34F
    @0xD34F Куратор тега JavaScript
    О каких элементах идёт речь:

    const parent = document.querySelector('.top');
    const elements = parent.children;

    Удаляем:

    parent.replaceChildren(...Array.prototype.filter.call(
      elements,
      function({ textContent: n }) {
        return !this.has(n) && this.add(n);
      },
      new Set
    ));

    или

    const { size: numUnique } = Array.prototype.reduce.call(
      elements,
      (acc, n) => acc.add(elements[acc.size].innerText = n.innerText),
      new Set
    );
    
    for (; elements[numUnique]; parent.lastElementChild.remove()) ;

    или

    parent.innerHTML = Array
      .from(new Set(Array.from(elements, n => n.outerHTML)))
      .join('');

    или

    Object
      .values(Array
        .from(elements)
        .reduce((acc, n) => ((acc[n.innerText] ??= []).push(n), acc), {}))
      .forEach(n => n.forEach((m, i) => i && parent.removeChild(m)));

    или

    [...elements]
      .filter((n, i, a) => n !== a.find(m => m.innerText === n.innerText))
      .forEach(n => n.replaceWith());
    Ответ написан
    Комментировать
  • Как из массива объектов получить массив уникальных ключей?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Коротко:

    const keys = [...new Set(arr.flatMap(Object.keys))];

    Длинно:

    const keys = arr.reduce((acc, n) => {
      for (const k in n) {
        if (n.hasOwnProperty(k) && !acc.includes(k)) {
          acc.push(k);
        }
      }
    
      return acc;
    }, []);
    Ответ написан
    Комментировать
  • Какие знания требуются для js trainee?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Чё-то смеюсь. Раньше вы хотели быть джуном. То, что за прошедшие два с лишним года вы свои амбиции поумерили - это хорошо. Правда, не до конца - ну да это ничего, ещё через два года наверняка дозреете до осознания того факта, что не бывать вам программистом. Отсюда кстати и ответ на непосредственно заданный вопрос - вам никакие знания не требуются. Успокойтесь, и идите работать в такси.
    Ответ написан
    2 комментария
  • Double Linked List, почему функция не отрабаывает и как организовать remove?

    0xD34F
    @0xD34F Куратор тега JavaScript
    На вопрос "почему не отрабатывает" ответ смотрите в консоли - там есть соответствующее сообщение об ошибке.

    class DoublyLinkedList {
      constructor() {
        this.size = 0;
        this.head = null;
        this.tail = null;
      }
    
      add(value, index) {
        index ??= this.size;
    
        const next = this.searchByIndex(index);
        const prev = next ? next.prev : this.tail;
        const node = { value, next, prev };
    
        prev || (this.head = node);
        next || (this.tail = node);
    
        prev && (prev.next = node);
        next && (next.prev = node);
    
        this.size++;
      }
    
      _remove(node) {
        if (node) {
          node.prev || (this.head = node.next);
          node.next || (this.tail = node.prev);
    
          node.prev && (node.prev.next = node.next);
          node.next && (node.next.prev = node.prev);
    
          this.size--;
        }
      }
    
      removeByValue(value) {
        this._remove(this.searchByValue(value));
      }
    
      removeByIndex(index) {
        this._remove(this.searchByIndex(index, true));
      }
    
      searchByIndex(index, strict) {
        if (!(index >= 0 && index <= this.size - !!strict)) {
          throw 'invalid index';
        }
    
        let node = this.head;
    
        while (index--) {
          node = node.next;
        }
    
        return node;
      }
    
      searchByValue(value, startIndex = 0) {
        let node = this.searchByIndex(startIndex, true);
    
        while (node && node.value !== value) {
          node = node.next;
        }
    
        return node;
      }
    }
    Ответ написан
    Комментировать