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

    0xD34F
    @0xD34F Куратор тега JavaScript
    Не нужны здесь регулярные выражения:

    const imgs = document.querySelectorAll('img[src*="/test/"]');

    UPD. Оказывается, автор вопроса с первого раза не сумел рассказать, чего ему надо. Вынесено из комментариев:

    это не в dom, а в строке

    Всё равно регулярные выражения не нужны. Парсим строку, ищем нужные элементы, получаем их разметку:

    const div = document.createElement('div');
    div.innerHTML = str;
    const imgsStr = ''.concat(...[].map.call(
      div.querySelectorAll('img[src*="/test/"]'),
      n => n.outerHTML
    ));

    или

    const imgsStr = Array
      .from(
        new DOMParser().parseFromString(str, 'text/html').querySelectorAll('img[src*="/test/"]'),
        n => n.outerHTML)
      .join('');

    или

    const imgsStr = Array.prototype.reduce.call(
      document.createRange().createContextualFragment(str).querySelectorAll('img[src*="/test/"]'),
      (acc, n) => acc + n.outerHTML,
      ''
    );

    UPD. Нет, со второго раза тоже не получилось. Всплыли ещё подробности:

    мне нужно удалить из этой строки все картинки, которые...

    Удалить, так удалить:

    const div = document.createElement('div');
    div.innerHTML = str;
    const imgs = div.querySelectorAll('img[src*="/test/"]');
    for (let i = 0; i < imgs.length; i++) {
      imgs[i].outerHTML = '';
    }
    str = div.innerHTML;

    или

    const { body } = new DOMParser().parseFromString(str, 'text/html');
    body.querySelectorAll('img[src*="/test/"]').forEach(n => n.remove());
    str = body.innerHTML;

    или

    const fragment = document.createRange().createContextualFragment(str);
    for (const n of fragment.querySelectorAll('img[src*="/test/"]')) {
      n.parentNode.removeChild(n);
    }
    str = Array.from(fragment.childNodes, n => n.outerHTML || n.nodeValue).join('');
    Ответ написан
    6 комментариев
  • Не распознаёт jsx, когда добавляю package.json, как лечить?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    ...но если кладу этот файл в отдельную папку и рядом с файлом создаю файл package.json с таким содержанием...

    Зачем?

    Срочно изучайте основы npm и wepack.

    Если хотите собирать бандл из другой директории измените путь в свойстве entry конфига webpack:
    module.exports = {
      entry: './path/to/my/entry/file.js'
    };

    package.json добавлять не надо, этот файл для других целей.
    Ответ написан
    2 комментария
  • В чём разница между isNaN и isFinite?

    webinar
    @webinar
    Учим yii: https://youtu.be/-WRMlGHLgRg
    isNaN - проверка на числовое значение
    isFinite - проверяет к тому же что бы числовое значение было конечно

    https://developer.mozilla.org/ru/docs/Web/JavaScri...
    https://developer.mozilla.org/ru/docs/Web/JavaScri...

    кроме того, что где одна функция возвращает true, там другая возвращает false

    Это не верное утверждение совсем. Сродни "зачем нужна цифра 3, если есть цифра 2 кроме того, что одна умноженная на 10 дает 30, а вторая 20"
    Ответ написан
    1 комментарий
  • Чем заменить такую запись?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    Выглядит конечно фигово, но с условными конструкциями будет еще фиговее. Можно более явно
    const res = Boolean(Number(myNumber));
    Но мне кажется, вам больше подойдет isFinite
    isFinite('123'); // true
    isFinite('123sss'); // false

    Данная функция сначала преобразует значение в число, и потом проверяет, является ли оно конечным числом.
    Ответ написан
    Комментировать
  • Чем заменить такую запись?

    0xD34F
    @0xD34F Куратор тега JavaScript
    переписать это, чтобы было более правильно

    !!+myNumber

    А что надо-то? Пропускать строки, содержащие числа? А неправильно сейчас то, что "0" теряете (а ещё строковые представления двоичных/восьмеричных/шестнадцатеричных чисел - "0b101"/"0o777"/"0xFF", например, признаются корректными значениями)?

    Можно регулярными выражениями воспользоваться:

    /^\d+$/.test(str) - только цифры (т.е., целые неотрицательные числа)

    /^-?\d+$/.test(str) - ниже нуля теперь окей

    /^-?\d+(\.\d+)?$/.test(str) - и дроби тоже
    Ответ написан
    Комментировать
  • Как заменить часть слова звёздочками?

    yarkov
    @yarkov Куратор тега JavaScript
    Помог ответ? Отметь решением.
    const string = 'string'
    console.log('*'.repeat(string.length - 2) + string.slice(-2))
    Ответ написан
    Комментировать
  • Как заменить часть слова звёздочками?

    @lemme
    Frontend
    str
      .slice(-2)
      .padStart(str.length, '*')
    Ответ написан
    Комментировать
  • Как заменить часть слова звёздочками?

    str.replace(/./gm, '*').slice(2) + str.slice(-2)
    Ответ написан
    Комментировать
  • Что присылать в качестве примера кода?

    Austin_Powers
    @Austin_Powers
    Web developer (Symfony, Go, Vue.js)
    Надо понимать, что это мера, для отсеивания совсем непригодных претендентов. А те кто пройдут, пойдут собеседоваться с техническим специалистом, отсюда два вывода:
    1) Даже по небольшому куску кода можно понять, что человек, например, не знаком с PSR, ООП или MVC и сделать для себя определенные выводы.
    2) На собеседовании не сложно понять, свой Вы код прислали или чужой.
    Ответ написан
    Комментировать
  • Как узнать какой по счёту элемент в dom дереве имеет определённый класс?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Определимся с элементом, у которого будем узнавать индекс - внутри кого он находится, что это за элемент, какой у него должен быть класс:

    const parentSelector = 'div';
    const childSelector = 'p';
    const className = 'there';
    
    const siblingsSelector = `${parentSelector} > ${childSelector}`;
    const elementSelector = `${siblingsSelector}.${className}`;

    Дальше есть варианты:

    const index = Array.prototype.findIndex.call(
      document.querySelectorAll(siblingsSelector),
      n => n.classList.contains(className)
    );

    или

    let index = -1;
    for (
      let el = document.querySelector(elementSelector);
      el;
      index++, el = el.previousElementSibling
    ) ;

    или

    const el = document.querySelector(elementSelector);
    const index = el ? [...el.parentNode.children].indexOf(el) : -1;

    Если вдруг у элемента могут быть другие соседи, не соответствующие childSelector, и они не должны учитываться, то третий вариант не подходит, а во втором надо заменить index++ на index += el.matches(childSelector).
    Ответ написан
    Комментировать
  • Как из набора элементов удалить определённое количество из начала и конца?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Где элементы находятся, и сколько с какого конца надо удалить:

    const selector = 'div p';
    const removeFromStart = 5;
    const removeFromEnd = 3;

    Удаляем:

    document.querySelectorAll(selector).forEach((n, i, a) => {
      if (i < removeFromStart || i > a.length - removeFromEnd - 1) {
        n.remove();
      }
    });

    Или, если родитель действительно общий, то можно и так:

    document.querySelectorAll([
      `${selector}:nth-child(-n+${removeFromStart})`,
      `${selector}:nth-last-child(-n+${removeFromEnd})`,
    ]).forEach(n => n.outerHTML = '');
    Ответ написан
    Комментировать
  • Как повесить фокус на изображение?

    Попробуйте добавить атрибут tabindex="0".
    Ответ написан
    Комментировать
  • Как достать данные из такого массива js?

    0xD34F
    @0xD34F Куратор тега JavaScript
    function find(arr, id) {
      for (const { name, hobbies } of arr) {
        const { title } = hobbies.find(n => n.id === id) || {};
        if (title) {
          return { name, title };
        }
      }
    
      return null;
    }
    
    
    const data = find(arr, 4);
    Ответ написан
    Комментировать
  • Как достать данные из такого массива js?

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

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    как теперь передать данные в эти компоненты из него?
    <Route exact path='/component' render={() => <myComponent prop={value}/>} />


    как сделать так, чтобы при загрузке заходило сразу на страницу '/component', а не на '/'?
    <Redirect exact from='/' to='/component'/>

    Я понимаю, что это удобно, когда за тебя думают другие, но вы попробуйте всё же документацию почитать: https://reacttraining.com/react-router/
    Я сам только вчера начал с этой библиотекой работать и, как видите, вполне смог ответить на эти вопросы.
    Ответ написан
    Комментировать
  • Как правильно сделать поля ввода на react?

    0xD34F
    @0xD34F Куратор тега React
    Работа с формами, это извините, основы. Читайте документацию.
    Ответ написан
    Комментировать
  • Как сделать такую функцию?

    SagePtr
    @SagePtr
    Еда - это святое
    Как-то так (в виде однострочника):
    const f = (a, sum) => a.reduce((r, x, i) => r.concat(a.slice(i+1).filter(y => x + y == sum).map(y => [x, y])), [])
    Но для больших объёмов данных это вряд ли будет эффективно, скорее всего, самое обычное решение с двумя вложенными циклами будет работать шустрее и менее затратно по памяти, чем в цикле гонять массив через slice/filter/map. В лоб это как-то так:
    const f = (a, sum) => {
      const l = a.length;
      let r = [];
      for (let i = 0; i < l-1; i++)
        for (let j = i+1; j < l; j++)
          if (a[i] + a[j] == sum)
            r.push([a[i], a[j]]);
      return r;
    }
    Ответ написан
    Комментировать
  • Как сделать такую функцию?

    yanis_kondakov
    @yanis_kondakov
    сложность O(n)

    Проходим по массиву только один раз. Для каждого элемента мы записываем разницу между текущим элементом и данной суммой и устанавливаем эту разницу как ключ в объекте. А значением для этого ключа ставим текущий элемент.

    const getPairsWithSumFromArr = (arr, sum) => {
        let map = {},
             res = [];
    
        for (let i=0; i < arr.length; i++) {
            const currEl = arr[i];
    
            if (map[currEl] !== undefined) {
                res.push([map[currEl], currEl]);
            } else {
                map[sum - currEl] = currEl;
            }
        }
    
        return res;
    }
    Ответ написан
    Комментировать
  • Как реализовать вычисления в виде цепочки вызовов методов?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Возвращайте this из всех методов, которые могут быть не последними в цепочке вызовов:

    function calc(val) {
      const self = Object.create(calc.prototype);
      self.val = val;
      return self;
    }
    calc.prototype = {
      plus(val) {
        this.val += val;
        return this;
      },
      minus(val) {
        this.val -= val;
        return this;
      },
      valueOf() {
        return this.val;
      },
    };
    
    +calc(0).plus(1); // 1
    +calc(1).plus(1).plus(1); // 3
    +calc(1).plus(2).plus(3).plus(4).minus(5); // 5
    calc(3).plus(7).minus(2) * 3; // 24
    99 + calc(1); // 100
    Ответ написан
    Комментировать
  • Чем отличаются компоненты высшего порядка и декораторы?

    miraage
    @miraage
    Старый прогер
    Если простыми словами..

    Декоратор - функция, которая принимает другую функцию (назовём её "базовая") на вход и возвращает третью функцию, которая у себя под капотом вызывает/использует базовую.

    HOC - частный случай декоратора, когда базовой функцией является React компонент.
    Ответ написан
    Комментировать