Задать вопрос
  • Почему WeakMap и WeakSet могут работать с 1 элементом, но не могут работать сразу со всей коллекцией данных?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Именно чтобы избежать неопределённости «а сработал ли уже сборщик мусора?», у WeakMap отсутствуют методы перечисления его элементов.

    В вашем коде нет смысла после удаления obj — чего ожидаете от weakMap(null)?

    Использование может быть, как приводят пример, в хранении приватных данных объекта или скрытия его реализации.

    Только сам объект, используя себя как известный ключ, может получить из weakMap какие-то припрятанные данные. Нет объекта — нет данных.
    Ответ написан
    Комментировать
  • Как вызвать функцию по имени через call?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Если функция объявлена как function UpdateName() { // ... } то можно так:
    this[v].call(null);

    Если объявлена как let или const, то хорошего варианта нет.
    Можно например, через eval(), но это крайне нежелательно:eval(`${v}.call(null)`); — т.е. составляется текстовая строка JS-кода, которая исполняется.

    Почему бы не составить объект с функциями:
    const methods = {
      UpdateName: () => { /* ... */ },
      UpdateAddress: () => { /* ... */ },
    };
    methods[v].call(null);
    Ответ написан
    Комментировать
  • Как получить картинку из множества слоев?

    Можно ещё Slice Tool'ом ("C") создать слайс из нужной области и SaveForWeb – там выбрать формат и параметры – Save – "Images Only" + "Selected Slices" – сохранит только нужный слайс.

    Потом одно Undo – и как будто ничего и не было )
    Ответ написан
    Комментировать
  • Как работает этот код?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Второй аргумент в Array.map() — это thisArg для функции.

    Тут абстрактный от конкретного массива pop() будет вызываться в контексте начального массива nums — последовательно выдирая из него последний из оставшихся элементов: 3, 2, 1
    Массив nums, соответственно, на каждой итерации будет становиться на 1 элемент короче.

    Копия исходного массива [...nums] нужна только ради его первоначальной длины, чтобы вызвать дальнейшую магию правильное число раз.
    Ответ написан
    3 комментария
  • Как вывести большой объем данных на страницу в табличном виде?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Никто не станет читать такое количество данных подряд.

    Нужны:
    Поиск. Фильрация. Сортировки. Пролистывание +1, +10, +100 страниц. В начало, в конец.
    Запоминать историю навигации / фильтрации / сортировки, чтобы можно было несколько раз вернуться «назад».

    Само отображение — рисовать только то, что на экране, плюс, может, небольшой запас вверх-вниз, в несколько строк. По мере прокрутки, переставлять строки, заполняя их новыми данными – т.н. «виртуальная прокрутка» == "virtual scrolling" – распространённая практика, полно готовых компонентов.
    Ответ написан
    2 комментария
  • Как подобным образом исказить текст? Какой инструмент можно использовать? И какие настройки инструмента?

    Нужно сделать ч/б градиент — очень узкую полоску ч-б-ч, которая задаст смещение:
    градиент
    62a8a683033d9929474320.png
    62a8a68adea7a790510091.png
    Полупрозрачно градиент над текстом, чтобы прикинуть расположение:62a8a53280c51446777320.jpeg
    Сохранить этот градиент как отдельный PSD файл.

    Затем применить фильтр - Distortion - Displace (Искажения - Смещение ?), где оставить горизонтальное 10, вертикальное в ноль.
    интерфейс фильтра
    62a8a61d1c5a4172429254.png
    И выбрать сохранённый файл с градиентом.

    Получится похоже:
    результат
    62a8a637eedff185771889.jpeg

    P.S. но лучше, наверное, это всё проделывать в векторе..
    Ответ написан
    2 комментария
  • Как сделать регулярное выражение для положительных и отрицательных чисел?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Регулярка тут не нужна и вредна. Почему бы просто не конвертировать в число и проверять, что в диапазоне?

    document.querySelector('input').addEventListener('input', e => {
      const { value } = e.target;
      const num = Number(value);
      const isValid = !isNaN(num) &&
        num <= 60 &&
        num >= -60;
    
      // что-то делаем с валидным / невалидным
      if (isValid) {
        // мы молодцы, сирену можно выключить
      } else {
        // включаем мигалку и сирены, подсвечиваем красным
      }
    });
    Ответ написан
    Комментировать
  • Как вычислить координату угла А прямоугольника?

    Тут не важны вершины C и D. Есть отрезок AB длины length под углом a, и координаты точки B. Нужна точка A.

    Наверное, всё просто:
    Ax = Bx - length * cos(a)
    Ay = By - length * sin(a)
    Ответ написан
    1 комментарий
  • Почему у функции в setInterval "пишем" одни скобки а не две вызывая ее при замыкании?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Потому, что в setInterval() первым аргументом надо передать функцию (он сам вызовет её потом),
    а «без setInterval» — для получения результата надо эту же функцию ещё и вызвать самим.

    длинный ответ
    Функцию в JavaScript можно «положить в переменную», передать как аргумент при вызове другой функции или получить как результат вызова ещё одной функции. Так же как "строку" или число 42.

    В этом выражении, смотрите, есть не 1, а целых 2 стрелочки:
    (param) => () => {
      console.log("Выхлоп!" + param);
    }
    Две стрелочки, значит, тут две функции. Одна вокруг второй. Первая, та, что снаружи, принимает аргументом param, и возвращает вторую функцию () => { console.log("Выхлоп!" + param); } Причём вернувшаяся функция «запомнила» значение param внешней обёртки и будет его использовать. Это обёртывание называется «Замыкание» или "closure".

    Теперь скобки при вызове. У нас матрёшка из двух функций: function(){ return function() {}; }

    Чтобы вызвать внешнюю, нужны первые скобки: ((param) => () => console.log(param))(6) – этот вызов внешней с аргументом 6 даст результатом внутреннюю функцию, которая запомнила значение param. И мы имеем на руках внутреннюю функцию.

    Чтобы вызвать внутреннюю, нужны вторые скобки: ((param) => () => console.log(param))(6)()

    Итого, две функции — два вызова — две пары скобок.

    В setInterval() первым аргументом надо передать не конечный результат, а функцию — её вызовут через некоторое время, не сразу. Тут передают внутреннюю функцию. Поэтому скобки всего одни: с одними скобками получаем внутреннюю функцию.
    Ответ написан
    1 комментарий
  • Как сделать круговое расположение букв в словах?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Библиотека CircleType (демо)
    Ответ написан
    Комментировать
  • Как сохранять цветовую тему в localstorage?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    при действии пользователя — сохранять в LS выбранное.
    при загрузке страницы — брать значение из LS или если-пусто, подставлять значение по-умолчанию.
    Что именно вызывает ступор?

    Пока там только две настройки: выбранный цвет и день/ночь. Я бы предложил хранить их в виде JSON под одним ключом localStorage. В одном объекте.

    Вообще, сделал бы объект Настроек центром всей затеи )
    В начале берётся или сохранённый в LS, или с дефолтными значениями.
    С помощью Proxy (обёртки) этого объекта, любое изменение любой из настроек сразу сохраняет весь объект в LS и применяет все эти настройки.

    Есть функция, которая получает на вход объект Настроек, и все везде отрисовывает как надо.

    Когда юзер выбирает цвет, день-ночь, или добавите что-то ещё – это действие только меняет настройку в проксированном объекте Настроек. Хитрость в том, что этот объект не простой, а Proxy-обёртка, которая реагирует на каждое изменение: сохраняет его в LS и отрисовывает.

    p.s. да и одинаковые квадраты делать в статичной разметке некруто. Заменил на массив цветов и программную отрисовку одинаковых элементов.


    Песочница
    Ответ написан
    6 комментариев
  • Насколько сложно написать приложение с распознаванием шахматных фигур?

    Распознавать положение и ход через камеру можно, с довольно хорошей надёжностью – т.к. положения фигур дискретны, из предыдущего положение кол-во возможных ходов лимитировано.

    Но польза от этой реализации – только до 50%. Т.к. ответные ходы сопреника никак не взаимодействуют с доской – надо читать ответный ход и самому переставлять фигуру соперника. Есть ещё и возможность при этом ошибиться. И тратить на это время (а если блиц, последние секунды?)

    Здорово было бы сделать доску с фигурами, приспособленную для дистанционной игры. OpenSource – чтобы коннектилась по BlueTooth и далее работала с любыми приложениями. С открытым API. : )

    От неё требуется по минимуму – распознавать, какая фигура где стоит; и подсвечивать клетки – ошибки, или откуда-куда пошёл соперник.

    По максимуму – механизация перемещения фигур. Но и это не решит обмен пешки на ферзя или другую, например. Если только не сделать площадь крупнее игрового поля – с «парковкой» для взятых и запасных фигур. (А если понадобится 8 белых ферзей?! : )
    Ответ написан
    1 комментарий
  • Как удалить Currency символ ₽?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    вместо asCurrency() может лучше asDecimal() в таком случае?
    Ответ написан
    Комментировать
  • Что здесь применяется в качестве значения this?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    delay() создаёт обёртку над функцией, чтобы выполнить её через какое-то время. При этом старается ничего не сломать – передать все аргументы и сохранить контекст (this) вызова. На всякий случай.

    Распутывайте задом наперёд.

    f.apply(context, ...) (документация) – вызовет копию функции f() с привязанным к ней контекстом context. Тут так сделали, чтобы наверняка передать контекст. Тот this, что был при вызове delay(), благополучно окажется и у вызываемой через паузу функции.

    А дальше смотрите как используют этот delay() – и вспоминайте про this у функций.

    Почему бы не наделать тестов:
    function delay(f, ms = 500) {
      return function d() {
        setTimeout(() => f.apply(this, arguments), ms);
      };
    }
    
    // функция для испытаний, будет выводить this
    function testThis(msg) {console.log(msg, this);}
    
    // Test 1
    delay(testThis)("Test1"); // Window
    
    // Test 2
    const obj = {
      title: 'test 2',
      method:  delay(testThis),
    };
    obj.method("Test 2"); // obj {title: 'test 2', method: d()}
    
    // Test 3
    const test3 = delay(testThis).bind({title: 'test 3'});
    test3("Test 3"); // Object {title: 'test 3'}
    
    // Test 4
    const maker = delay(testThis);
    const M = new maker('Test 4'); // Object { }
    Ответ написан
    2 комментария
  • Как остановить выполнение js кода с условием?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Код располагайте не «ниже», а «позже»:
    • оберните в функцию и вызывайте после получения данных («коллбек»).
    • или откройте для себя волшебный мир промисов и асинхронного JavaScript.
    Ответ написан
    Комментировать
  • Я не могу понять, как настроить в Premiere pro 2021 так, чтобы видео в обычном плеере был в полное окно?

    В исходном видео у вас здоровенные чёрные области вокруг картинки. Их надо отрезать.

    Создать композицию, вставить этот клип, открывть панельку Effect Controls и там найти Scale. Поднять со 100% до где-то 200%, пока края мультяшки не начнут исчезать за краем видимого. Теперь черных краёв не будет.

    Ну, или можно просто в ffmpeg подобрать правильные границы видимого мульта, и эффектом crop вырезать из исходного большого видео только мультяшную часть кадра. Этот вариант быстрее-легче-удобнее, если у вас большое количество клипов, которые надо обрезать совершенно одинаково.
    Ответ написан
  • Как менять цвет input в зависимости от значения?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const colors = {
      '3': 'red',
      '2': 'green',
      '1': 'blue',
      '0': 'black',
    };
    
    const setColor= input => {
      const { value } = input;
      if (colors.hasOwnProperty(value)) {
        input.style.backgroundColor = colors[value];
      }
    }
    
    const onInput = e => {
      setColor(e.target);
    }
    
    document.querySelectorAll('input')
      .forEach(elem => {
        elem.addEventListener('input', onInput);
        setColor(elem);
      });


    песочница
    Ответ написан
    1 комментарий
  • Библиотеки синтаксического сахара на PHP?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    поищите на github

    для массивов там среди результатов MortalFlesh/MFCollectionsPHP
    Ответ написан
    Комментировать
  • Добавить value в инпут внутри айфрейм?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    если только владелец «другого сайта» явно не подготовился к тому, чтобы разрешить всем или только вашему сайту проделывать такой трюк — это невозможно.
    Иначе открываем в айфрейме сайт банка и переводим себе все средства..

    см. Same-Origin policy
    Ответ написан
    3 комментария