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

    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))


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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Может, так:
    const result = menuElements.map(item => {
      const out = {};
      out.key = item.key;
      out.title = item.title;
      if( item.type) out.type = item.type;
      if( item.children) out.children = item.children;
      return out;
    });


    Fiddle

    result (2) […]​
    0: Object { key: "siteSettings", title: "Настройки сайта", children: (1) […] }
    ​1: Object { key: "shopSettings", title: "Настройки магазина", children: (2) […] 
    }​length: 2​<prototype>: Array [] _display:76:5
    Ответ написан
    Комментировать
  • Можно ли динамически создать элементы с разными id и названиями через цикл?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Реализуемо.

    Создать новый элемент: element = document.createElement('input');
    Далее ему можно задать нужные атрибуты id и name:
    element.id = "kakoj-to-id";
    element.name = "kakoe-to-imya";

    Элемент создан, заданы его атрибуты, теперь его надо куда-то вставить в документ. Например, в конец body:
    document.body.appendChild(element);
    После этого новый инпут появился на странице.

    Для заданного числа надо проделать выше описанные шаги в цикле. Номер итерации можно использовать для создания уникальных id и name:
    while(i--) {
        let el = d.createElement('input');
        el.type = 'text';
        el.placeholder = el.id = 'in-' + i;
        el.name = 'v-' + i;
        div.appendChild(el);
      }


    Ответ написан
    Комментировать
  • Ускорить время загрузки скрипта?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Версия 2.0 уже слегка устарела, сейчас актуальная 2.1.
    В вопросе загружается полная (стандартная) версия библиотеки, т.е. там всё для отрисовки карт и пр. Если нужно только геокодирование, можно указать модули geocode и geolocation – должно быть полегче:
    <script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU&load=geolocation,geocode"></script>


    Затем остаётся запросить положение пользователя и перевести его в locality – город/село:
    ymaps.geolocation.get()
      .then(
        result => {
          const pos = result.geoObjects.position;
          return ymaps.geocode(pos, {
            kind: 'locality'
          });
        },
        err => console.log('Ошибка 1: ' + err)
      )
      .then(
        result => {
          const city = result.geoObjects.get(0).properties.get('name');
          document.getElementById('city').innerText = city;
        },
        err => console.log('Ошибка 2: ' + err)
      )
      .catch(err => console.log('Errrr', err));


    jsFiddle
    Ответ написан
    2 комментария
  • Как перебрать многомерный объект?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    for..in

    for (size in burger) { // size будет 'smallburger' и 'bigburger'
      for (prop in burger[size]) { // внутри каждого: 'name', 'cost' и 'ccal'
        console.log(size, prop, burger[size][prop]);
      }
    }
    Ответ написан
    Комментировать
  • Как решить задачу с классами ES6?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Посмотрите страничку на MDN про классы.

    И вот тут ещё посмотрите Статические свойства.

    B.x обращается к статическому свойству класса, а new B().x – к свойству инстанса.
    Ответ написан
    Комментировать
  • Как объединить большое количество условий?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    if (a === 1) {
      do('a');
    } else if (a === 2) {
      do('b');
    ...
    } else {
      do('ни один if');
    }
    Ответ написан
    Комментировать
  • Как посчитать кол-во кликов в JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Подробностей задачи маловато. Но как я понял, делается что-то типа серой схемы накрутки кликов – задачи для пользователя накликать по баннерам на сторонних сайтах, перед тем как его допустят к «призовому» контенту. Не связывайтесь с такими заказами.

    Технически – вариант считать клики на сервере. Ловить события кликов и отправлять на сервер сообщение о каждом клике. На призовой странице через WebSockets принимать с сервера пуш, когда кликов будет достаточно.
    Ответ написан
  • Почему скаллинг работает неправильно?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Неправильно считается Y центра кружочка. Вместо
    .attr('cy', d => (height + paddings.top - xScale(d[1])))
    Должно быть
    .attr('cy', d => yScale(d[1]))
    Ответ написан
    Комментировать
  • Можно ли так писать в js?

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

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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Сохраняйте только значение флага и при загрузке страницы выполняйте функцию.

    Объект для сохранения в *Storage сериализуется в текст. Как JSON.stringify() При этом теряются исполняемые методы и ссылки на узлы DOM-дерева. Да и само DOM-дерево-то на новой странице будет уже другое.
    Ответ написан
  • Почему не работает код js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    На момент выполнения кода jQuery еще не загружен.
    Ответ написан
    5 комментариев
  • Дайте совет, как построить самый простой график?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Без библиотек, как я понял по комментариям ТС, можно просто отрисовать график в SVG и разместить на сайте.
    Это можно сделать в Adobe Illustrator или другом векторном редакторе и вывести оттуда готовый SVG.

    Из массива координат строить график также можно без библиотек, разобравшись в несложном синтаксе SVG и самостоятельно написав простой код. Вам понадобится добавлять элементы line.

    Удобнее, с прицелом на будущее, использовать дополнительную, не-jQuery и не-Bootstrap, библиотеку. В идеале разобраться с D3js. Там и масштабирование осей под данные, и динамическое обновление графика по данным и интерактивность – всё легко кодируется, но придётся инвестировать пару часов в обучение.
    Ответ написан
    Комментировать
  • Как реализовать некоторый аналог сессий на JS?

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

    Иначе, как уже посоветовали, в localStorage:
    // при добавлении ноута в коллекцию
    localStorage.setItem('laptops', JSON.stringify( laptopArray ));
    
    // при рендере страницы после перехода
    var laptopArray = JSON.parse(localStorage.getItem('laptops')) || [];
    Ответ написан
    Комментировать