• Регулярное выражение php длина строки?

    0xD34F
    @0xD34F Куратор тега Регулярные выражения
    ^\d{8}(\d{4})?$
    Ответ написан
    Комментировать
  • Как реализовать функцию, которая принимает любое неотрицательное целое число и возвращает его цифрами в порядке убывания?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const sortDigits = num => +[...`${num}`].sort((a, b) => b - a).join('');

    или

    const sortDigits = num => ''.concat.apply('', num.toString().split('').sort().reverse()) - 0;

    или

    const sortDigits = num => Number(Array
      .from('' + num)
      .reduce((acc, n) => (acc[n]++, acc), Array(10).fill(0))
      .reduceRight((acc, n, i) => acc + String(i).repeat(n), '')
    );

    или

    const sortDigits = num => Array
      .prototype
      .reduce
      .call(String(num), (acc, n) => ((acc[9 - n] ??= []).push(n | 0), acc), [])
      .flat()
      .reduce((acc, n) => acc * 10 + n, 0);
    Ответ написан
    1 комментарий
  • Как обрезать слишком длинный текст при выводе?

    0xD34F
    @0xD34F Куратор тега Vue.js
    methods: {
      short: (str, maxlen) => str.length <= maxlen ? str : str.slice(0, maxlen) + '...',
    },

    <div v-for="n in items" v-text="short(n.text, 16)"></div>
    Ответ написан
    Комментировать
  • Как выполнять вычисления с помощью функций (результат вызова предыдущей должен быть аргументом следующей)?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const [ zero, one, two, three, four, five, six, seven, eight, nine ] = Array.from(
      { length: 10 },
      (_, i) => f => f instanceof Function ? f(i) : i
      // или
      // (_, i) => f => f?.(i) ?? i
    );
    
    const plus = a => b => b + a;
    const minus = a => b => b - a;
    const times = a => b => b * a;
    const dividedBy = a => b => b / a | 0;
    Ответ написан
    Комментировать
  • Как выполнять вычисления с помощью функций (результат вызова предыдущей должен быть аргументом следующей)?

    phaggi
    @phaggi
    лужу, паяю, ЭВМы починяю
    Решаю задачи на codewars, не могу решить задачу с функциями?

    Да, не можете.
    Ответ написан
    Комментировать
  • Как поставить Linux на смартфон?

    vabka
    @vabka
    Токсичный шарпист
    Дистр общего назначения типа дебиана, нативно, и с поддержкой всей периферии - точно нет.

    Железо у телефонов сильно специфичное и требует кучи проприетарных драйверов, которых как правило нет в ядре.
    На телефонах даже нет EFI, по тому загрузить даже что-то минимальное типа busybox очень нелегко (
    https://github.com/aligator/init-linux-beside-android
    )

    В теории можно запускать полноценный Linux внутри android:
    https://medium.com/@quantvc/running-debian-on-andr...

    Я бы оставил эту затею и взял бы лучше какой-нибудь одноплатник
    Ответ написан
    9 комментариев
  • Как удалить все классы, начинающиеся с определённой подстроки?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Array.from(el.classList).forEach(n => el.classList.toggle(n, !!n.indexOf('modal--')));

    или

    el.classList.remove(...[...el.classList].filter(n => n.startsWith('modal--')));

    или

    for (let i = el.classList.length; i--; ) {
      if (el.classList[i].search('modal--') === 0) {
        el.classList.remove(el.classList[i]);
      }
    }

    или

    el.className = el.className.split(' ').filter(n => !/^modal--/.test(n)).join(' ');

    или

    el.className = el.className.replace(/(^| )modal--\S*/g, '').trim();
    Ответ написан
    9 комментариев
  • Как вывести значения false общим числовым количеством?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const statsMeta = [
      { title: 'отредактированные', count: item => +item.edited },
      { title: 'неотредактированные', count: item => +!item.edited },
      { title: 'всего', count: () => 1 },
    ];
    
    const statsData = allMessages.reduce((acc, n) => (
      statsMeta.forEach((m, i) => acc[i] += m.count(n)),
      acc
    ), Array(statsMeta.length).fill(0));
    
    console.log(statsMeta.map((n, i) => `${n.title}: ${statsData[i]}`).join('\n'));
    Ответ написан
    Комментировать
  • Как изменить имена ключей в массиве объектов исходя из другого массива объектов?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const result = arr2.map(function(n) {
      return Object.fromEntries(this.map(m => [ m[1], n[m[0]] ]));
    }, arr1.flatMap(Object.entries));

    или

    const keys = Object.entries(Object.assign({}, ...arr1));
    const result = arr2.map(n => keys.reduce((acc, m) => (acc[m[1]] = n[m[0]], acc), {}));
    Ответ написан
    4 комментария
  • Как экранировать стили?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега CSS
    Куда «экранировать»? Зачем «экранировать»? Вы хотите, чтобы стиль магически применялся только к лежащей рядом с ней кнопке? Так не работает. Используйте классы или идентификаторы, если не хотите инлайново писать. Ну или какой-то сложный селектор. Короче, в стиле должно быть явно указано какую button вы имеете в виду от корня документа.
    Ответ написан
    Комментировать
  • Когда стоит вкладывать input в label, а когда нет?

    KulakovAngel
    @KulakovAngel
    Full Stack Developer (Node.JS)
    В целом, с точки зрения правильности/валидности кода, как заметил Danny Arty, разницы нет. В примитивных случаях верстки визуальной разницы тоже особо не наблюдается.

    Но если нужно сверстать что-то посложнее, сделать более интересное оформление, разница появляется, поскольку нам нужно взаимодействовать с разным порядком и вложенностью различных тегов. Сравните:

    1. В таком варианте у нас имеется два рядом расположенных тега. Чтобы выбрать второй, идущий после первого, можно использовать "соседский" селектор "+" (Label идет сразу после Input). Данный вариант более "независимый", так как мы можем менять местами input и label, и даже разносить их на удаленное расстояние.
    <style>
      input + label {
        color: #ff0000;
      }
    </style>
    
    <input type="checkbox" id="checkbox" />
    <label for="checkbox">чекбокс</label>


    2. И второй вариант. Здесь мы не можем только средствами html/css обратиться "от input к label", так как не существует способа обратиться от ребенка к родителю (это можно, конечно, легко сделать через JS). Существуют селекторы потомков и соседей, но не родителей. Можно обратиться только от label к input, что дает мало преимуществ, так как
    1. input плохо стилизуется
    2. label обычно ничем не примечателен в отличие от input, который информативен (содержит, например, атрибут type).

    <style>
      label > input  {
        outline-color: #ff0000;
        outline-style: double;
      }
    </style>
    
    <label>
      <input type="checkbox" />
      чекбокс
    </label>


    А теперь представим, что нам нужно сверстать нечто подобное на основе (см. картинку):
    5ffea6239c1da641320430.png

    Как это реализовать? Для label соорудим ":before" и ":after", которым дадим форму скругленного прямоугольника и круга (который, к тому же будет перемещаться).

    Здесь второй вариант нам явно не подойдет, так как мы бы хотели в зависимости от состояния checkbox (.checkbox:checked) изменять родственный ему label:before (изменять цвет, перемещать).
    Если хотите взглянуть подробнее на код, пожалуйста:

    Таким образом, принципиальной разницы нет, но первый вариант (с id) более универсален, так как
    1. input и label могут быть разнесены физически (находится в разных местах документа)
    2. label может идти после input, что дает нам возможность обратиться в CSS от второго к первому

    Надеюсь, ответил на Ваш вопрос.
    Ответ написан
    Комментировать
  • Как преобразовать массив в под массив + объект?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    «С методами» это в одну строку:
    arr.map(item => Object.fromEntries([item]))

    Разжёванный учебный костыль «без методов»
    const resultArr = [];
    for (let i = 0; i < arr.length; i++) {
      const item = arr[i];
      const obj = {};
      obj[item[0]] = item[1];
      resultArr.push(obj);
    }

    или покороче
    const resultArr = [];
    for (let [prop, value] of arr) {
      const obj = { [prop]: value };
      resultArr.push(obj);
    }
    Ответ написан
    1 комментарий
  • С чего начать системному администратору в школе?

    @Drno
    1. - беги оттуда... работы дохера, денег нифига
    А по теме -

    надо создать "карту" сети, где будут ПК которым нужен доступ, спланировать прокладку сети.
    далее можно поделить участки на "квадраты", чтобы приводить туда 1 кабель и ставить свитч, а не вести кучу проводов до каждого ПК
    после этих подсчетов возвращайтесь - будем подбирать оборудование
    Ответ написан
    10 комментариев
  • Как сделать кликабельную кнопку?

    phaggi
    @phaggi
    лужу, паяю, ЭВМы починяю
    Надо менять код до тех пор, пока не заработает как надо.
    Ответ написан
    Комментировать
  • Как сложить radio и checkbox и вывести итоговой цифрой в форме на jquery?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const form = document.querySelector('form');
    
    form.addEventListener('change', () => {
      form.querySelector('.result').innerText = Array
        .from(form.querySelectorAll(':checked'))
        .reduce((acc, n) => acc + +n.getAttribute('rel'), 0);
    });
    
    form.dispatchEvent(new Event('change'));
    Ответ написан
    Комментировать
  • Как сделать чтобы при нажатии на кнопку открывался только один элемент, а не все?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Сразу определим селекторы элементов и класс, они нам дальше понадобятся:

    const blockSelector = 'селектор блоков';
    const buttonSelector = 'селектор кнопок';
    const activeClass = 'класс, показывающий блок';

    Класс надо переключать не у всех блоков сразу, а у того, который соответствует нажатой кнопке. Как определить, какой блок нужен? Можно просто по индексу. Нажали третью кнопку - нужен третий блок. Как узнать индекс кнопки? Например, он передаётся в коллбек метода forEach. Т.е., в список параметров внешнего forEach добавляем индекс, и вместо внутреннего forEach выполняем обращение к соответствующему элементу коллекции блоков:

    const blocks = document.querySelectorAll(blockSelector);
    const buttons = document.querySelectorAll(buttonSelector);
    
    buttons.forEach((n, i) => {
      n.addEventListener('click', () => {
        blocks[i].classList.toggle(activeClass);
      });
    });

    Кстати, создавать отдельные обработчики клика для каждой из кнопок не обязательно, можно сделать один общий. Как при этом получать индексы? - их можно прицепить прямо к кнопкам. Например, в виде data-атрибута:

    const onClick = function({ currentTarget: { dataset: { index } } }) {
      this[index].classList.toggle(activeClass);
    }.bind(document.querySelectorAll(blockSelector));
    
    document.querySelectorAll(buttonSelector).forEach((n, i) => {
      n.dataset.index = i;
      n.addEventListener('click', onClick);
    });

    Также есть вариант вычислять индекс при клике:

    const blocks = document.querySelectorAll(blockSelector);
    const buttons = document.querySelectorAll(buttonSelector);
    
    buttons.forEach(n => n.addEventListener('click', onClick));
    
    function onClick() {
      const index = Array.prototype.indexOf.call(buttons, this);
      blocks[index].classList.toggle(activeClass);
    }

    А вообще, если у каждой из пар кнопка-блок есть отдельный общий предок (const containerSelector = '...';), то индексы не нужны. Достаточно от нажатой кнопки подняться до общего предка кнопки и блока, и найти внутри блок (а можно даже и не искать, если добавлять класс контейнеру; конечно, стили придётся в этом случае немного изменить, вместо .блок.класс будет .контейнер.класс .блок):

    const toggleBlock = button => button
      ?.closest(containerSelector)
      ?.querySelector(blockSelector)
      .classList
      .toggle(activeClass);
    
    
    // можно добавить обработчик клика каждой кнопке индивидуально
    document.querySelectorAll(buttonSelector).forEach(function(n) {
      n.addEventListener('click', this);
    }, e => toggleBlock(e.currentTarget));
    
    // или один раз на всю страницу
    document.addEventListener('click', e => {
      toggleBlock(e.target.closest(buttonSelector));
    });
    Ответ написан
    Комментировать
  • В основе flex или inline-block?

    Ankhena
    @Ankhena Куратор тега CSS
    Нежно люблю верстку
    Дело в том, что флекс был не всегда. И раньше элементы в ряд выстраивали инлайн-блоками, ещё раньше флоатами.

    Сейчас инлайн-блок нужен для того, для чего придуман, т.е. чтобы элемент получил строчно-блочное отображение. Т.е. элемент ведёт себя снаружи как строчный, а внутри как блочный. А также реагирует на свойства задающие ширину, высоту, отступы.

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

    Stalker_RED
    @Stalker_RED
    Будь это нормальные ссылки, можно было бы сделать так
    const number = new URLSearchParams(link).get("TicketNumber");

    Но у вас там вместо амперсандов в качестве разделителя точка с запятой. И чем "чинить" такие ссылк проще уж сразу регуляркой.
    TicketNumber=(\d+)
    https://regex101.com/r/eASIwF/1
    Ответ написан
    1 комментарий
  • Как создать тег на хабр Q & A?

    0xD34F
    @0xD34F
    Открываете форму обратной связи. В выпадающем списке "тема" выбираете пункт "гениальная идея". В текстовом поле "текст сообщения" излагаете суть - что за тэг, и почему его следует добавить. Подсказка: "почему следует добавить" - это, как минимум, наличие уже существующих вопросов, к которым новый тэг можно будет прицепить, и, наверное, не в количестве 3-5-10 штук, а побольше. Так что прежде чем предлагать добавление тэга, стоит воспользоваться поиском - убедитесь, что оно того стоит.
    Ответ написан
    Комментировать
  • Как сгруппировать и отсортировать массив имён?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const groupedAndSortedArr = Object
      .values(arr.reduce((acc, n) => ((acc[n[0]] ??= []).push(n), acc), {}))
      .sort((a, b) => a[0][0].localeCompare(b[0][0]));
    Ответ написан
    6 комментариев