• Как убрать абзац в массиве js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно /регулярным выражением/
    заменить пробел-и-подобные символы \s, включая перенос строки,
    идущих один-или-несколько подряд +
    на просто-пробел ' ':
    const name = "str 1\nstr 2";
    console.log(name); 
    // str 1
    // str 2
    
    console.log( name.replace(/\s+/g, ' ') );
    // "str 1 str 2"
    ключ g ("global") после выражения – чтобы заменить не единственный первый встречный раз, а "глобально", во всём предоставленном тексте.
    Ответ написан
    1 комментарий
  • Как я могу ждать выполнения setInterval?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вот пример с setTimeout() — сначала зарядится таймер, отработает: отресолвит промис, и после этого уже сработает финальный console.log()
    async function monitor() {
      await new Promise(resolve => {
        setTimeout(() => {
          console.log("Прошла секунда");
          resolve();
        }, 1000);
      });
    
      console.log("После Вас!")
    }
    
    monitor();
    Ответ написан
    3 комментария
  • Как защитить сайт от непорядочных заказчиков?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    «пакостливые решения» плохой вариант. Когда из двоих кто-то жульничает — не будьте им : )

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

    Ваша задача минимизировать свои риски. Для этого бить работу на чёткие этапы, фиксировать выполнение и оплату каждого, прежде, чем приступать к следующему. Хотелки клиента — каждую документировать и включать в «следующий релиз». Срочно-ой-помираю! хотелки — по предоплате. Раз «помирает» – оплатит. Или не было.
    Ответ написан
    2 комментария
  • Содержимое массива меняется само по себе?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    defaultDepts заполнен объектами. Объекты передаются по ссылке в JS.
    [...defaultDepts] создаёт новый массив старых объектов. Меняете что-то внутри этих объектов — меняется и внутри defaultDepts.

    Нужна «глубокая копия».

    Причём не просто
    [...this.defaultDepartments].map(item => {...item})
    , а нормальная рекурсивная. Ведь ещё и свойство colleagues, с свою очередь, содержит массив объектов.
    Ответ написан
    3 комментария
  • Почему 0.35 -> toFixed(1) = 0.3?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    какая несправедливость:
    [.05, .15, .25, .35, .45, .55, .65, .75, .85, .95]
    .map(v => `${v} - ${v.toFixed(1)}`).join("\n");
    /*
    0.05 - 0.1
    0.15 - 0.1
    0.25 - 0.3
    0.35 - 0.3
    0.45 - 0.5
    0.55 - 0.6
    0.65 - 0.7
    0.75 - 0.8
    0.85 - 0.8
    0.95 - 0.9
    */
    1-1, 3-3, 8-8
    Ответ написан
    Комментировать
  • Алгоритм максимально равномерного распределения предметов?

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    Расставить начальные значения на оси.
    Значение указывает на одно или больше «ведёрок» из начального массива, которые надо наполнять.
    Двигаться слева направо, накапливая «вёдра», в которые льём.

    На каждом шаге известно, сколько осталось запаса для разлива.
    Есть «ёмкость» шага – кол-во вёдер умноженное на длину текущего шага.
    Пока запас выше или равен ёмкости – добавляем в текущие вёдра поровну и к следующему шагу.
    Потом, если что-то осталось – разделить поровну, округлив в бОльшую сторону, и по очереди раздавать по актуальным ведёркам.
    JavaScript
    далеко не оптимальный код, но, вроде, рабочий
    function spread(arr, src) {
      const result = [...arr]; // копия исходного массива
      if (src <= 0) return result;
    
      const axis = {}; // value: [ids of bins]
      arr.forEach((v, i) => {
        if (!axis[v]) axis[v] = [];
        axis[v].push(i);
      });
    
      const keys = Object.keys(axis).sort((a, b) => a - b);
    
      const bins = [...axis[keys[0]]]; // ids of "bins" we're filling
      for (let i = 1; i < keys.length; i++) {
        const currentKey = keys[i];
        const prevKey = keys[i - 1];
        const diff = currentKey - prevKey;
        const capacity = bins.length * diff;
        
        if (src < capacity) break;
    
        bins.forEach(key => result[key] += diff);
        src -= capacity;
        bins.push(...axis[currentKey]);
      }
    
      if (src) {
        const want = Math.ceil(src / bins.length);
        bins.forEach(key => {
          const given = Math.min(src, want)
          result[key] += given;
          src -= given;
        });
      }
    
      console.log(result);
      return result;
    }
    
    spread([30, 50, 350], 300); // [ 190, 190, 350 ]
    spread([30, 50, 350], 1001); // [ 477, 477, 477 ]
    spread([130, 50, 50, 101], 800); // [ 282, 283, 283, 283 ]
    Ответ написан
  • Как на чистом JavaScript получить значение атрибута элемента по классу?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    document.addEventListener('click', event => {
      const { target } = event;
      if (target.tagName !== 'DIV'
          || !target.classList.contains('elem')) {
        return;
      }
      console.log(target.dataset.name);
    });


    Песочница
    Ответ написан
    7 комментариев
  • Можно ли использовать пиратские VST для музыки в играх?

    «Авторское право» ... «Можно ли использовать пиратские ... ?» — нет, нельзя.

    Всё прочее — вопрос совести и юриспруденции. С помощью Content-id некоторые сэмплы узнать можно, некоторые нет. Должны ли вы доказывать легальность используемого софта и сэмплов — указывается (или забывается) в контракте с заказчиком музыки, как и то, какие риски и объём ответственности вы принимаете на себя.

    Очистка от копирайта / проверка прав использованной музыки, графики и пр. — головная боль выпускающих игру на рынок.

    Disclaimer. Этот ответ не основан на реальном опыте и является лишь моей интерпретацией здравого смысла.
    Ответ написан
    2 комментария
  • В каком формате рендерить видео разрешением 13440*2160?

    Похоже на «видео-стену» из 7 * 2 = 14 дисплеев 1920 x 1080 каждый.
    Может, не одним потоком на них подаётся картинка, а 14-ю параллельными видеофайлами синхронно ?

    Композицию вы, конечно, будете делать единую в полном разрешении.
    Показывать клиентам уменьшенное превью.

    А выводить, скорее всего, в 14 отдельных видеофайлов 1920x1080 под каждый из экранов. Или один контейнер с 14 видео-потоками. Тот же MP4 может содержать любое количество объектов любого типа.

    Впрочем, неизвестно, какой именно формат требуется для видео-стены. Может, и единый файл в адском разрешении, а у них там уже есть сплиттер на отдельные экраны. Этот момент в вопросе не обозначен.
    Ответ написан
    3 комментария
  • Почему split не разбивает строку на строку + число?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    с регулярками можно проще.
    Разбить на группы только-буквы или только-цифры:
    let re = /((\D+)|(\d+))/g; // \D не-цифра, \d цифра
    
    'user100'.match(re)  // [ "user", "100" ]
    '2022habr06QnA'.match(re)  // [ "2022", "habr", "06", "QnA" ]
    Ответ написан
    1 комментарий
  • Почему не работает код для перестановки блоков?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Попробуйте как-то так:
    const blockRelocate = () => {
      const elSource = document.querySelector('.description-wrapper');
      if (!elSource) {
        return setTimeout(blockRelocate, 150);
      }
      const elTarget = document.querySelector('.item-calculator_container');
      elTarget.insertAdjacentElement('beforebegin', elSource);
    }
    
    blockRelocate();
    Ответ написан
  • При запуске код даёт ошибку. Python youtube_dl ffmpeg and ffprobe are mising install one,как решить?

    сами исполняемые файлы ffprobe и ffmpeg надо скачать и установить в системе и прописать в PATH.
    Чтобы если в терминале набрать ffmpeg – оно выполнилось и вывело версию и кучу всего.
    Ответ написан
    Комментировать
  • С помощью какой проги можно с видео записи отрывки аудио записей вырезать?

    ffmpeg из командной строки вполне справится с задачей. Если известны временные метки «от» и «до».

    Например, с 12-й секунды, длительностью 22 секунды (до 12+22=34-й секунды исходного видео) сохранить только звук в WAV:
    ffmpeg \
      -ss 12 \
      -i video.mp4 \
      -t 22 \
      audio_12_34.wav
    Ответ написан
    1 комментарий
  • Как решить проблемисы с Cannot read properties of null?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно слушать клики не на самих div'ах под удаление, а выше. Только создаваемые div'ы как-то помечать, например, доп. классом, чтобы не поудалять лишнее.
    В слушателе кликов выше проверять: есть ли у кликнутого элемента event.target тот самый класс.
    Ответ написан
    1 комментарий
  • Где используется Map и Set в JavaScript (примеры использования)?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Set удобен, например, когда нужно оставить из набора данных только уникальные.
    пример кода
    const data = [ 1, 2, 2, 3, 3, 3 ];
    const unique = [...new Set(data)];
    unique // [ 1, 2, 3 ]

    Map хорош тем, что ключами в нём могут быть и объекты. Например, HTML-элементы, для которых захочется хранить какие-то данные. И Map запоминает порядок добавления элементов, что может быть полезно при переборе.
    Ответ написан
    Комментировать
  • Как сделать кликабельными кнопки и чтобы им переходили стили?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    CSS классами опишите вид обычной кнопки и «активной» – с доп. классом .active

    По клику на кнопку снимайте класс .active у всех кнопок,
    и затем добавляйте его только кликнутой кнопке.
    Ответ написан
    Комментировать
  • Почему когда я обнуляю value в коллекции WeakMap, value остается прежним?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    если убрать весь пафос WeakMap, с простыми переменными всё точно так же:
    let value = { name: 'iOne' };
    let x = value; // ещё одна "ссылка" на объект
    
    value = null; // или  delete value; – то же самое
    x //  { name: "iOne" }
    Разберитесь с основами: Объекты и ссылки на объекты. Т.к. в объекте weakMap есть ссылка от ключа на объект-значение — объект вполне себе сохраняется. Главное, что всё ещё жива ссылка на объект-ключ key.

    Особенность WeakMap  – в тех объектах, которые выступают не значениями, а ключами.
    const weakMap = new WeakMap();
    let value = {name: 'Ivan'};
    let key = {};
    
    // добавление нового элемента
    weakMap.set(key, value);
    
    // обнуление
    delete key;
    Теперь, хоть объект, на который указывала переменная key всё ещё используется в качестве ключа в WeakMap, сборщик мусора, при срабатывании, таки удалит его.
    Ответ написан
    Комментировать
  • Что происходит при экспорте видео?

    1. у видео кодеков ещё масса параметров, влияющих на качество и объем файла. Но самый поверхностный – битрейт. Увеличился битрейт – файл стал тяжелее.

    2. качество при каждом перекодировании — падает. Поэтому лучше избегать перекодирования там, где оно необязательно. Например, когда только лишь вырезаете часть по времени, перекодировать не нужно, т.к. картинка остаётся та же самая. Поэтому п.3:

    3. просто обрезать видео лучше без перекодирования. Это можно сделать прямо из командной строки могучим инструментом ffmpeg. Примерная команда:
    ffmpeg \
      -ss 15 \         # пропустить 15 секунд от начала
      -i Source.mp4 \  # имя исходного файла
      -t 30 \          # продолжительность 30 сек.
      -c copy \        # кодек "копия" - не перекодировать
      Result.mp4       # что получится - в этот файл
    только удалите все комментарии – после слешей должен сразу быть перенос строки. Этот вариант, пожалуй, самый быстрый из возможных.
    Ответ написан
    4 комментария
  • Как правильно работать с Promise?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вопрос если разница в таких записях?

    Только в передаваемом значении:
    • resolve(script) передаст дальше по цепочке этот script (который никому не нужен, похоже).
    • script.onload = resolve передаст по цепочке объект события (тоже всем по барабану)

    почему такой ее вызов дает ошибку script.onload = resolve(script);
    потому, что нужна функция, которую вызовут позже, а не мгновенный результат её выполнения.
    Ответ написан
    Комментировать
  • Почему filter возвращает пустой массив?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Надо же фильтровать по индексам элементов массива, а у вас по самим элементам, которые совсем не числа и не делятся на 2 )
    // odd.filter(item => item%2);
    odd.filter((_, i) => i & 1);
    Ответ написан
    Комментировать