Ответы пользователя по тегу JavaScript
  • Как найти координаты точек круга?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Простой вариант, когда смотрят на шар на уровне экватора, в параллельной проекции.
    Центр шара примем за точку отсчёта, ноль.
    Два угла определяют положение точки на поверхности шара относительно его центра:
    • широта (latitude, север-юг) от -∏/2 (северный полюс) до ∏/2 (южный полюс);
    • долгота (longitude, запад-восток) от 0 до 2∏ (полный круг).


    В прокции на плоскость (экран) точки шара попадут внутрь окружности радиуса R. Центр попадет в центр. Северный полюс – в верхнюю точку, южный – в нижнюю.

    Высота зависит только от широты, тут всё просто: y = R * sin(lat)
    Влево-вправо от центральной оси зависит от обоих углов. От широты зависит максимально возможное удаление от оси R * cos(lat). А ещё уменьшиться оно может в зависимости от долготы: надо домножить на cos(lng). Итого получается x = R * cos(lat) * cos(lng)



    Кроме того посмотрите в коде, как правильно создавать элементы внутри SVG и задавать им атрибуты. А также значение viewBox чтобы (0, 0) была по центру.
    Ответ написан
    1 комментарий
  • Как сделать простой скрипт на js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Не удобно, что именно классами вы помечаете связь item - message. Т.к. могут быть и другие классы, может возникнуть путаница, какой из них считать признаком, а который там просто для оформления. Лучше для этого задействовать data-атрибуты.

    В нынешнем варианте надо по клику на .item искать в списке классов другой, не равный "item" – это идентификатор для поиска соотв. message. Про то, чтобы «гасить» другие с классом .active в вопросе нет, поэтому примерно так:
    Ответ написан
    Комментировать
  • Как конвертировать домены xn-- на русский с помощью JavaScript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Ответ написан
    Комментировать
  • Где взять задачи по JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Ответ написан
    Комментировать
  • Как работает метод call изнутри?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно через apply() или bind(), но реализация стека и контекста так и останется под закрытым капотом.
    Ответ написан
    Комментировать
  • Почему не работает JS-код?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Разница в том, когда выполняется код.

    Первые две строки выполняются сразу при загрузке документа. Переменной num назначается значение пустого на тот момент input'а.

    На btn вешается слушатель события. Он не выполняется сразу, а сидит и ждёт события. При каждом возникновении события, выполняется внутренний код функции getSquareNum()

    Код внутри функции – вот этот alert() – выполняется позже, при нажатии кнопки. Выводит определённое в самом начале значение num в квадрате. Или же берет свежее, «на сейчас», значение из input'а во втором варианте кода с «если вместо num подставить document.get...».
    Ответ написан
    1 комментарий
  • Как посчитать количество постов за сутки у отдельного человека?

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

    Но что же? По какой причине не хотите использовать БД или иное хранилище?

    Так или иначе надо сохранять id самого свежего проверенного поста на каждой из стен. Чтобы потом проверять до него, при необходимости проверив глубже, чем на 100 постов.

    • можно проверять глубже, чем последние 100 постов, указав параметр offset
    • можно «упаковать» до 25 вызовов к API ВК в один запрос execute(), тогда в секунду можно выполнить не 3 а 75 запросов
    • в качестве хранилища можно использовать не локальную БД а ВКонтактовский storage.
    Ответ написан
    Комментировать
  • В чём разница между isNaN и isFinite?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Пример, опровергающий утверждение о зависимости этих двух методов:
    var n = 2/0; // деление на ноль
    isFinite(n)  // false
    isNaN(n)     // false
    Ответ написан
    Комментировать
  • Как получить свойство goal передав параметр в функцию f?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Значит, на вход подается строка, где через точку перечислен путь к вложенному свойству, и объект:
    f( "a.goal", x)

    Можно сделать через рекурсию. На каждом «шаге» функция путь обрабатывает самый левый кусок цепочки. Для "a.goal" это будет "a". Нужно проверить, есть ли такое свойство у объекта. И если есть, то вернуть вызов этой же функции, но цепочка уже короче, остается только "goal" и объект не x, а x.a:
    var x = {
      a: {
        goal: 1,
        b: 2,
      },
      c: 3
    };
    
    
    function f(value, chain) {
      if(chain.length === 0) return value;
      
      const propsArray = chain.split('.'); // "a.goal" => ["a", "goal"]
      const property = propsArray[0];
      
      if(!value.hasOwnProperty(property)) return; // несуществующее свойство
    
      return f(value[property], propsArray.slice(1).join('.')); // вызыв функцией самой себя
      // но цепочка свойств короче на 1 элемент – самый левый отрезали
    }
    
    console.log( "Result:", f(x, 'a.goal')); // 1
    Ответ написан
    2 комментария
  • Как отложить выполнение кода пока не будет получен ответ от сервера?

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

    Команды пользователя складывать в очередь, и как-то помечать, «где мы сейчас»: ждём очередную команду от пользователя или ждём ответа от сервера.

    Состояние можно держать в Redis, MySQL или другой БД. Входящее сообщение от пользователя содержит его from.id – по нему идентифицируется диалог и берется его состояние.

    Промисы и прочая асинхрота тут не поможет, так как дело шире, чем один запрос.
    Ответ написан
  • Как получить хеш сумму файла на клиенте?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    1. FileReader API, чтобы считать содержание файла. См. Using files from web applications
    2. sha256 хэш, например emn178/js-sha256

     

    В PHP такое же значение получается через hash('sha256', file_get_contents($filepath))
    Ответ написан
    1 комментарий
  • Почему в верхнем вопросе три варианта правильных, а в нижнем- кейпрес неправильный ответ?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    потому, что клавиша Shift является модификатором:
    5ba7f54ebe68f121469377.png
    Ответ написан
    Комментировать
  • Как вывести текущую дату + завтрашнюю или послезавтрашнюю?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно менять номер дня — прибавлять дни, не боясь выйти за рамки месяца:
    const today = new Date(); // сегодня, сейчас. 22 сентября
    
    const tomorrow = new Date();
    tomorrow.setDate( tomorrow.getDate() + 1); // +1 день, 23 сентября, это же время.
    
    const plus13days = new Date();
    plus13days.setDate( plus13days.getDate() + 13); // +13 дней, 5 октября
    Ответ написан
    Комментировать
  • Как получить значения из массива, которые содержат часть строки?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно использовать метод массива filter()

    const filteredArray = array.filter( el => el.id.substring(0,3) === '051' )
    Ответ написан
    1 комментарий
  • Можно ли получить параметры запроса js скрипта?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно найти все элементы script на странице, их атрибуты src, и вытащить параметры. Открытый вопрос, как узнать в каком из найденных файлов содержится исполняемый сейчас код..
    Ответ написан
    1 комментарий
  • Как выводить строку только в определенном формате?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    • \d – одна цифра
    • (\d) – одна цифра, и мы её запомнили, чтобы потом вывести через $1, $2, ... $8
    • \s – один пробельный символ
    • \s? – один пробельный символ, но если его нет - тоже ок
    • \- – один символ дефиса (тоже надо экранировать)
    • \-? – один символ дефиса, если его нет, то и ладно.


    Допуская одиночные пробелы в любом месте где-то между:
    var re = /(\d)\s?(\d)\s?(\d)\s?(\d)\s?\-?\s?(\d)\s?(\d)\s?(\d)\s?(\d)/;
    
    var tests = [
      '1600 1800', // 16:00 - 18:00
      '16001800', // 16:00 - 18:00
      'abc def 16001800 geh', // abc def 16:00 - 18:00 geh
      'zzzz16001800zzz' // zzzz16:00 - 18:00zzz
    ];
    tests.map(e => e.replace(re, '$1$2:$3$4 - $5$6:$7$8'))


    Подводные камни:
    1. про двоеточия в исходном тексте не говорили
    2. заменит любую последовательность из 8 цифр, в т.ч. из номера телефона +7 495 5554321 сделает +74:95 - 55:54321
    3. минус "-" это не короткое "–" или длинное "—" тире, если в исходном тексте будут тире, не заметит.
    Ответ написан
    Комментировать
  • Какой библиотекой на Node.js можно воспользоваться для равномерного деления?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно решить рекурсией.

    На каждом шаге получаем очередное слагаемое, округляя результат к ближайшему в «сетке» с учётом точности. Для целых это выглядит так:
    Math.round(20 / 3) === 7 // 7 занесли в массив результата
    20 - 7 = 13 
    // далее повторяем с 13 и делим уже на 3 - 1 === 2
    Math.round(13 / 2) === 7 // 7 идёт в результат
    13 - 7 === 6
    // далее повторяем с 6 и делить надо бы на 2 - 1 === 1
    // т.е. осталось одно число в результат. Просто вписываем туда остаток 6


    С точностью надо умножать/делить на эту точность перед тем, как округлять к ближайшему целому. Но тут вылезают проблемы с точностью плавающей точки. Поэтому надо уточнить, какие могут быть значения точности: до опр. знака после запятой, или вообще любое значение типа 0.137456?
    function split(n, divisor, q, result) {
      q = q || 1;
      result = result || [];
      const m = q * Math.round(n / divisor / q);
      result.push(m);
      n -= m;
      if( --divisor > 1) return split(n, divisor, q, result);
      else {
        result.push(n);
        return result.sort((a,b) => a - b); // сортировка по возрастанию, на всякий случай
      }
    }
    
    
    split(20, 3) // [6, 7, 7]
    split(20, 3, 0.1) // [6.6000000000000005, 6.7, 6.7]
    split(27.8, 4, 0.1) // [6.9, 6.9, 7, 7]
    Ответ написан
    Комментировать
  • Есть ли оператор +-?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Оператора нет, но можно мильёном способов. Например:
    if (Math.abs(175 - rost) < 5) { /* средний рост*/ }
    
    if ((175 - rost) * (175 - rost) <  5 * 5) { /* средний рост*/ }
    Ответ написан
    Комментировать
  • Как получить только время с json api?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Там в поле date возвращается помимо поля #text ещё поле uts – unix timestamp. Удобнее использовать его. Вместо var date = value["date"]["#text"]; как-то так:
    var date = new Date(1000 * parseInt(value["date"]["uts"])); // дата-время из трека
    var now =  new Date(); // сейчас
    // теперь сравнивайте две даты
    var diff = Math.floor((now - date) / 1000); // прошло секунд
    var when = '';
    if( diff < 3600) {
      when = '' + Math.floor(diff / 60) + ' минут назад';
    } else if( diff < 86400) {
      when = '' + Math.floor(diff / 3600) + ' часов назад';
    } else if( diff < (7 * 86400)) {
      when = '' + Math.floot(diff / 86400) + ' дней назад';
    } // ...  и так далее
    Ответ написан
    1 комментарий
  • Как отфильтровать подобный массив?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Some_variable = Some_variable.filter( el => !!~arr.indexOf(el.type))


    Если нужно, чтобы остались только те типы, которых нет в списке, уберите один воскл. знак.
    Ответ написан
    Комментировать