Ответы пользователя по тегу JavaScript
  • Как сформировать такой массив?

    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')) || [];
    Ответ написан
    Комментировать
  • Почему функция не привязывается к указаному классу?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    TypeError: $ is not a function

    не подключён jQuery на момент выполнения этого кода.
    Ответ написан
  • Как применить условие к нескольким классам и id?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    перечислить селекторы через запятую?

    Вместо ".required" написать ".required, #parent_cat_id, #category_id"
    Ответ написан
    2 комментария
  • Как реализовать автоматическую коррекцию формата ввода в калькуляторе на JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вот такое регулярное выражение заменит ноль в начале строки на пустую строку, если за нулём НЕ идёт один из . + - * /

    var re = /^0(?![\.\+\-\/\*])/;
    
    ['03','0','0.','0+'].map(s => s.replace(re,'')) /* 3,,0.,0+ */


    Просто единственный ноль также удалится – ведь за ним не идёт один из спец-символов. Поэтому применяйте эту регулярку только когда длина строки больше 1.
    Старый ответ

    Неудобно организовано, т.к. содержание табло может поменяться из нескольких мест..
    С минимальными правками отн. нынешнего варианта, можно попробовать так:
    везде, где изменяется содержание табло, получать введённые числа (бить строку по одному из + - * /; каждую из частей бить по точке, и каждое из получившихся целых прогонять через parseInt() – это отбросит нули в начале. Потом собирать: склеить точкой, склеить знаком операции.

    Но лучше как-то иначе организовать всю логику. Например, в процессе ввода не текстовую строку собирать, а заполнять массив числами и операторами. [5.1, "*", 4.2, "-", 3.7] И перед склейкой в одну строку для отображения в табло, проводить необходимые коррекции чисел.
    Ответ написан
  • Как правильно получить элемент по классу (js)?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно через querySelectorAll()
    // внутри ul с классом list ищем все li
    var myNodeList = document.querySelectorAll('ul.list li');
    
    if( myNodeList.length) { // что-то нашлось, коллекция не пустая
      var el0 = myNodeList[0]; // первый 
    }
    Рабочий пример

    Метод querySelectorAll() есть и у документа и у элемента. Так что можно сначала получить элемент, внутри которого искать, а затем внутри него собрать коллекцию:
    var list = document.querySelectorAll('ul.list'); // все UL класса list в документе
    if( list.length) {
      var items = list[0].querySelectorAll('.list');
      // любые элементы класса list внутри первого найденного ul.list
    
      if(items.length) {
        var item = items[0]; // первый из li
      }
    }
    Ответ написан
    Комментировать
  • Как это работает (алгоритм с использованием рекурсии для вычисление числа Фибоначчи)?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Числа Фибоначчи – это последовательность, начиная с 0 и 1, где каждый следующий равен сумме двух предыдущих.

    Третий равен 0 + 1 = 1 // итого первые три ряда: 0 1 1
    Четвёртый это сумма последних двух единиц = 2 // 0 1 1 2
    Пятый это 1 + 2 = 3 // 0 1 1 2 3
    И так далее. Вот начало ряда:
    значение:         0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144
    порядковый номер: 0  1  2  3  4  5  6   7   8   9  10  11  12
    Восьмой, если считать с 0, равен 21.

    Параметром в функцию getFibonachi() передаётся не значение, а порядковый номер элемента ряда Фибоначчи, а функция должна вернуть значение.

    Чтобы вычислить очередное значение, надо знать два предыдущих. Отсюда и (n-1) и (n-2)

    Поскольку любой элемент ряда считается одинаково, пишут всего одну функцию. Она сразу готова дать ответ для первых двух элементов, если n = 0 или 1. В остальных случаях ей придётся вызывать саму себя.

    Движок JavaScript'а сам позаботится о хранении промежуточных значений и цепочки кто-кого вызвал и с каким параметром.
    Ответ написан
    Комментировать
  • Бинарный поиск в координатной сетке?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    По координатам вычисляйте индекс квадрата. Что-то типа dlina_stroki * position.y + position.x
    Это точно быстрее поиска, пусть и бинарного )

    Если там действительно квадраты через единый шаг, то так должно получиться. Квадраты в массиве ведь упорядочены по колонкам, столбцам? Пример с реальными данными помог бы.

    Допустим, там целочисленные координаты от 0 до 1800 с шагом 200. Поле 10x10 — массив длиной 100.
    0,0      200,0    400,0    ... 1800,0
    0,200    200,200  400,200  ... 1800,200
    0,400    200,400  400,400  ... 1800,400
    ...
    0,1800   200,1800 400,1800 ... 1800,1800


    Интересует индекс элемента (400,200)

    i = storona * y / shag + x / shag

    Шаг у нас shag = 200 значит, искомый индекс 10 * 200 / 200 + 400 / 200 = 12
    Ответ написан
    Комментировать