• Как реализовать лайк на js?

    @W1zzyy
    Fullstack developer python/js/ts/bootstrap/less
    так если ты это сам написал, то делаешь -1 по аналогии
    Ответ написан
    1 комментарий
  • Как проверить, что набор карт образует покерную комбинацию "стрит"?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Сделать вспомогательный объект, где для нечисловых карт будут указываться их числовые эквиваленты. Массив карт превратить в массив соответствующих им чисел (карты используется как ключ для извлечения значения из объекта, если ничего не найдено, то карта приводится к числу); отсортировать массив; убедиться, что разность соседних значений всегда составляет единицу.

    const weights = {
      j: 11,
      q: 12,
      k: 13,
      a: 14,
    };
    
    const isStraight = hand => hand
      .map(n => weights[n] ?? +n)
      .sort((a, b) => a - b)
      .every((n, i, a) => !i || (n - a[i - 1] === 1));
    Ответ написан
    Комментировать
  • Какой текстовый редактор умеет работать с файлами до 5Гб?

    martin74ua
    @martin74ua Куратор тега MySQL
    Linux administrator
    man sed
    man awk

    честно говоря не уверен, что обычный текстовый редактор справится с такими объемами. В этом случае линуксовые потоковые редакторы лучше подходят под задачу.
    Ответ написан
    Комментировать
  • НДС на digitalocean? Как работает?

    @lexico
    Мы поставили налоговый регион Казахстан.
    Сразу после этого ничего не изменилось, но после 1 платежа, НДС стал 0%. Но наверное стоит отметить, что карта для оплаты использовалась казахстанская
    Ответ написан
    1 комментарий
  • Как сделать проверку открытых сайтов на js?

    XOR2048
    @XOR2048
    Web & Browser extension developer
    Как уже сказали - "написать расширение для браузера и заставить всех его установить себе". Пример такого расширения (и кода) можно увидеть у Mozilla.

    Статья

    Само расширение, можно подсмотреть как это реализовывается
    Ответ написан
    Комментировать
  • Как лучше проверять строку на пустоту в php?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    if ($str === '')
    Ответ написан
    Комментировать
  • Какими знаниями php нужны чтобы начать изучать laravel?

    JhaoDa
    @JhaoDa
    LaravelRUS Team
    Нужно ли знать интерфейсы и трейты, регулярные выражения?

    Не нужно, так многие делают. Получается полная херня, но они считают, что нормально. Это как сесть за руль, сказав «ПДД обязательно потом буду учить».
    Ответ написан
    Комментировать
  • Как отфильтровать массив обьектов?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    const dataNew = {};
    
    data.forEach(
      (item) => dataNew[item.City] ? dataNew[item.City].push(item) : dataNew[item.City] = [item]
    );


    Есть ещё вариант с reduce, но он, имхо, гораздо менее читаемым получается.

    P.S. Это не фильтрация, а группировка.
    Ответ написан
    4 комментария
  • Почему такая очередь задач?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    1. Срабатывает then и добавляет в очередь микрозадач свой каллбэк.
    2. Срабатывает setTimeout (22222222) и добавляет в очередь макрозадач свой каллбэк.
    3. Основной стек пуст, вызывается задача из очереди микрозадач.
    4. Срабатывает setTimeout (11111) и добавляет в очередь макрозадач свой каллбэк.
    5. Основной стек пуст, очередь микрозадач пуста, вызывается задача из очереди макрозадач.
    6. Выводится '22222222'.
    7. Основной стек пуст, очередь микрозадач пуста, вызывается задача из очереди макрозадач.
    8. Выводится '11111'.
    9. Основной стек пуст, очередь микрозадач пуста, очередь макрозадач пуста.
    Ответ написан
    1 комментарий
  • JS как сделать так, чтобы скрипт не замедлялся когда окно свёрнуто?

    Anopeng
    @Anopeng
    Веб-программист, учу фронт и бек
    Конкретно для таймера, можно запоминать время старта и просто высчитывать разницу, каждую сотую секунды например
    Ответ написан
    2 комментария
  • Как сделать чтобы рандом всегда давал новые значения?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    У вас переменная random (случайное число) генерируется единожды, и дальше используется при каждом нажатии на кнопку.

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

    P.S. на заметку:
    На первое место выпадает шанс не 10%, а всего 5% случаев. И ещё 5% не будет попадать в границы массива, что будет приводить к ошибке.
    ((0.00)*10).toFixed() // "0"
    ((0.01)*10).toFixed() // "0"
    ((0.04)*10).toFixed() // "0"
    ((0.05)*10).toFixed() // "1"
    ((0.94)*10).toFixed() // "9"
    ((0.95)*10).toFixed() // "10"
    ((0.96)*10).toFixed() // "10"
    Ответ написан
    Комментировать
  • Можно ли давать людям сервера на docker?

    @Akela_wolf
    Extreme Programmer
    Docker != VPS

    Главное отличие: VPS - это сервер к которому пользователь имеет полный доступ и может устанавливать и запускать любые программы. Docker - это инструмент для запуска единственного процесса в определенном окружении.

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

    AgentSmith
    @AgentSmith
    Это мой правильный ответ на твой вопрос
    Частично можно это сделать фильтрами, но в общем виде задача нерешаемая.
    Люди вручную в фотошопе это делают, подстраиваясь под конкретную фотографию, а ты даже пример фото не привёл
    Ответ написан
    Комментировать
  • Как записать рекурсию (функц. глубокого копирования) в виде цикла?

    0xD34F
    @0xD34F
    Используйте стек.

    Если, обрабатывая данные, натыкаетесь на объект, надо сохранить в стек текущее состояние - ссылку на копируемые данные, индекс текущего элемента, ссылку на объект, куда копируете; затем установить новое состояние - копируемыми данными будет массив пар ключ-значение встреченного объекта, индекс обнуляется (на самом деле надо выставить -1, нулевое значение будет получено при переходе к следующей итерации; конечно, можно и буквально 0 выставлять, но тогда придётся усложнить работу с индексом - тут увеличиваем, а тут нет), пустой объект в качестве копии.

    Если данные закончились, надо восстановить состояние из стека.

    Условий, при которых возможно продолжение цикла, будет два - кроме наличия необработанных данных ещё и непустой стек.

    function clone(value) {
      const clone = {};
      const stack = [];
    
      for (
        let i = 0, source = [ [ '', value ] ], target = clone;
        i < source.length || stack.length;
        i++
      ) {
        if (i === source.length) {
          [ i, source, target ] = stack.pop();
        } else {
          const [ k, v ] = source[i];
          const isObject = v instanceof Object;
    
          target[k] = isObject ? v.constructor() : v;
    
          if (isObject) {
            stack.push([ i, source, target ]);
            [ i, source, target ] = [ -1, Object.entries(v), target[k] ];
          }
        }
      }
    
      return clone[''];
    }

    Или, если в копируемом объекте могут быть циклические ссылки или какой-то из вложенных объектов встречается несколько раз и так же должно быть и в копии, то надо запоминать встреченные объекты, чтобы не обрабатывать их повторно - воспользуемся Map'ом, где ключами будут оригинальные объекты, а значениями их копии.

    Как выглядит получение копии объекта: проверяем, встречался ли указанный объект ранее, если нет - создаём новый объект, сохраняем его в Map, а также кладём его вместе с оригиналом в стек, для последующей обработки; достаём из Map'а копию.

    Крутим цикл, пока стек не пуст, на каждой итерации достаём из стека объект и его копию, перебираем свойства оригинала, записываем в копию копии значений.

    function clone(value) {
      const stack = [];
      const clones = new Map;
      const getClone = val => val instanceof Object
        ? (clones.has(val) || stack.push([ val, clones.set(val, val.constructor()).get(val) ]),
           clones.get(val))
        : val;
    
      for (getClone(value); stack.length;) {
        const [ source, target ] = stack.pop();
        Object.entries(source).forEach(n => target[n[0]] = getClone(n[1]));
      }
    
      return getClone(value);
    }

    как правильнее всего будет это сделать?

    Перестать заниматься ерундой и начать использовать готовые решения - structuredClone или cloneDeep, например.
    Ответ написан
    Комментировать
  • Как написать этот код легче?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const newData = data.reduce((acc, n) => {
      const k = Object.keys(n)[0];
      (acc.result[acc.keys[k] = (acc.keys[k] ?? -1) + 1] ??= []).push(n);
      return acc;
    }, { result: [], keys: {} }).result.flat();

    или

    const numKeys = new Set(data.flatMap(Object.keys)).size;
    const numObjs = data.length / numKeys;
    const newData = data.map((n, i, a) => a[(i % numKeys) * numObjs + (i / numKeys | 0)]);
    Ответ написан
    2 комментария
  • Почему в миксин нельзя передать экземпляр класса?

    Alexandroppolus
    @Alexandroppolus
    кодир
    Метод say лежит в прототипе экземпляра Sounds, а не в самом экземпляре.
    Object.assign копирует только содержимое непосредственно объекта, не заглядывая в его прототип. Так мир устроен.
    Ответ написан
    1 комментарий
  • Что нужно знать для junior frontend developer?

    @goshaLoonny
    Frontend Developer Roadmap карта составленная профессионалами отрасли. Последнее обновление информации было 19 дней назад.
    И 191К звезд на гитхабе подтверждают надежность информации
    github: kamranahmedse/developer-roadmap
    Ответ написан
    2 комментария
  • Как почистить Git-репозиторий?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Вот несколько фактов, которые помогут понять как работает Git.
    • Файл .gitignore действует только на ещё не отслеживаемые файлы.
    • Файл .gitignore предназначен для описания того, что мы не хотим СЛУЧАЙНО добавить в репозиторий. Либо не хотим случайно удалить переключив ветку.
    • Мы можем ПРИНУДИТЕЛЬНО добавить в репозиторий ЛЮБОЙ файл, даже если он описан в .gitignore.
    • Добавление файла в .gitignore не удалит сам файл из репозитория. Если файл УЖЕ в репозитории, то он продолжит отслеживаться, независимо от наличия .gitignore.
    • Если больше не хотим отслеживать какой-то файл, то просто удаляем его из репозитория. Ключ --cached позволит оставить файл в рабочем каталоге текущего репозитория если он нужен.
    git rm --cached -- '.DS_Store'
    git commit

    Но последний рецепт сработает только на одном компьютере. Если коллеги переключатся на этот коммит, то файл удалится у них из рабочего каталога.
    Ответ написан
    4 комментария