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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Надо понимать, что этот код делает. Он составляет все возможные комбинации из заданных чисел, длиной столько же цифр – и возвращает массив этих чисел. Вас интересует его длина.
    • Можно взять длину массива, который вернули.
    • Можно взять длину Nисходного массива и возвести её в степень себя: NN.
      Для трёх это будет 3 в кубе 3*3*3 = 27
    Ответ написан
    Комментировать
  • Как сделать цикл который генерирует числа из 1, 2, 3?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const shred = arr => arr.reduce((p,c,i,a) => {
        const f = prefix => {
          for (let j=0; j<a.length; j++)
            if (prefix.length < a.length - 1) {
              f(prefix + a[j]);
            } else {
              p.push(+(prefix + a[j]));
            }
        }
        f(c.toString());
        return p;
      }, []);
      
      shred([1,2,3]);
    /*
    [111,112,113,121,122,123,131,132,133,211,212,213,221,222,223,231,232,233,311,312,313,321,322,323,331,332,333]
    */
    Ответ написан
    Комментировать
  • Как подключить все js библиотеки в 1 файл?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    UglifyJS

    Установить (понадобится nodejs + npm):
    npm install uglify-js

    Собрать и сжать несколько библиотек в один файл:
    uglifyjs --compress -o result.js -- jquery.js  lib2.js  lib3.js

    В результате получится один файл result.js, который содержит в себе все указанные выше билиотеки. Его одного и подключайте в страницу.
    Ответ написан
    Комментировать
  • Как реализовать поставленную задачу?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно считать градиенты с соседними элементами, при этом следующий становится предыдущим:
    function countLocalMax(arr) {
        const last = arr.length;
        let prevGrad = 1;
        return arr.reduce((p,c,i,a)=>{
          const nextGrad = i === last ? -1 : a[i+1] - c;
          if (prevGrad >= 0 && nextGrad <= 0) p++;
          prevGrad = nextGrad;
          return p;
        }, 0);
      }
    
    countLocalMax([0,0,3,4,5,4,0,-1]); // 2

    Для нулевого элемента массива считаем "предыдущий" градиент положительным, для последнего – отрицательным.
    Элемент локальный максимум, если предыдущий градиент не отрицательный и следующий не положительный.
    Ответ написан
  • Как добавить элемент?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Как добавить элемент в конец ?

    appendChild()

    Неправильный, но легкий способ: если у родителя не навешаны слушатели событий, то просто заменить HTML:
    var runRo1 = document.getElementsByClassName('btn send-private-message-btn white');
    if(runRo1.length == 1){
      runRo1[0].innerHTML += '<div class="buy-deposit btn white" only-other-profile="">Забронировать на бирже</div>';
    }


    Но если вариант с innerHTML что-то порушит - перестанет там где-то реагировать на клики, то надо делать «правильно»: создавать элемент и вставлять в конец через appendChild():
    if(..) {
      const div = document.createElement('div');
      div.classList.add('buy-deposit', 'btn', 'white');
      div.setAttribute('only-other-profile', '');
      div.appendChild( document.createTextNode('Забронировать на бирже'));
      runRo1[0].appendChild(div);
    }
    Ответ написан
    Комментировать
  • Как сделать fetch запрос к сайду недоступном на территории РФ?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Если запрос делать из браузера, то в настройках браузера сначала надо ввести этот прокси-сервер, и все запросы, включая fetch() пойдут через него.

    Если из Node.js, то, например, модуль TooTallNate/node-https-proxy-agent позволит в параметрах fetch() указывать прокси, через который выполнять подключение.
    fetch('https://www.google.com',{ agent:new HttpsProxyAgent('http://127.0.0.1:8580')})
    .then(function(res){
        //...
    })
    Ответ написан
    4 комментария
  • Как сгенерировать случайное число, содержащее две единицы?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно сыграть с девятиричной системой. Раз тут цифра "1" особенная, а остальные девять обычные. Берём случайное число, записываем его в девятиричной системе n.toString(9) – используются цифры от 0 до 8 и точно нет ни одной девятки. Единицы меняем на девятки. Остаётся добавить две единицы на случайных позициях.

    function tworandom() {
      const arr = Math.floor(Math.random() * 9e8).toString(9).replace(/1/g,9).split('');
      for (let i = 2; i > 0; i--) arr.splice(Math.floor(Math.random() * arr.length), 0, 1);
      return +arr.join('');
    }
    
    [...Array(5)].map(tworandom)
    // 6401715726, 950818173966, 915469690179, 4191464422, 223063891715
    Ответ написан
    Комментировать
  • Как сделать программу для угадывания загаданных чисел JS?

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

    Таким образом, понадобятся две переменные с этими границами.

    Грязный код, но примерно работает:

    Todo: надо предусмотреть конечные случаи, когда остаётся всего два варианта, например, 48 или 49.
    Тогда надо предположить одно из них, и оставить вместо трёх, всего две кнопки: "Да, это оно" и "Нет, больше".
    Ответ написан
  • Как вывести две глобальные переменные на экран передав их в аргументы функции?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    только одна функция? Но что б были аргументы в функции и return.

    Нужно больше скобок:
    ((d, id, x, y) => d.getElementById(id).innerText = x + y) // это функция
    (document, "r", 1, 2) // а это аргументы


    ..Хотя нет, return потерялся.
    Ответ написан
    Комментировать
  • В чем заключается ошибка в коде?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Перенесите строку var p = ... внутрь функции, перед p.innerHTML =
    Ответ написан
    Комментировать
  • Для чего используется правый сдвиг с заполнением нулями?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Нет под рукой хороших примеров, но, как я себе представляю:
    • >> без заполнения нулями, с сохранением знака, требуется при работе с числами
    • >>> с заполнением нулями нужен, например, при работе с битовыми масками
    Ответ написан
    Комментировать
  • Аналог die (php) в JavaScript?

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

    В отличие от PHP, JavaScript асинхронен.

    Можно оборвать цикл, выйти из функции, кинуть exception.
    Но останутся висеть партизанские таймеры, слушатели событий, промисы.

    (И как только отвернёшься, они поползут выполняться)
    Ответ написан
    6 комментариев
  • Объединение двух отсортированных массивов?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В нынешнем варианте функция не возвращает результата и меняет не глобальный массив, а переданный ей аргументом. При этом исходный массив остается неизменным. Вот доказательство этого косяка в Scratchpad'е FireFox'а:
    (()=>{  
      function merge(nums1, m, nums2, n) {
        nums1 = nums1.slice(0, m).concat(nums2).sort((a, b) => a - b);
      }
      
      var nums1 = [46,55,88,0,0,0,0];
      merge( nums1, 3, [18,29,80,90], 4);
    
      return JSON.stringify(nums1);
    })()
    /*
    [46,55,88,0,0,0,0] // исходный массив не изменился
    */
    Ответ написан
    1 комментарий
  • .color = как вывести цвет что я впишу в Input?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В переменную text_color надо получить введенное в форму значение цвета, чтобы использовать потом. Точно так же, как следующей строчкой вы получаете значение текста.

    Когда создали элемент LI, вот ему надо задать .style.color = text_color;

    Примерно так
    Ответ написан
  • Почему код выполняется асинхронно?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Вот здесь вы вешаете слушателя события. И он сидит себе и ждет:
    oReq.addEventListener("load", reqListener);
    Дальше вы инициируете вызов - это как ввести адрес сайта в браузере и нажать ввод. Но интернет медленный, сайт тормозной. Пройдет какое-то время.

    И вот, наконец, когда страница соизволит загрузиться, выстрелит событие "load", которое и будет отловлено слушателем - выполнится, наконец-то, функция reqListener()

    Разрыв, рвущий нить выполнения этого кода и делающий его из синхронного асинхронным – где-то внутри объекта XMLHttpRequest и не виден невооруженным глазом.

    Теоретически, внутри мог бы быть и синхронный код, который по методу send() сразу же явно дергал функцию, которую мы передали как слушателя события. Но это был бы уже не тот XMLHttpRequest, каким мы его любим.
    Ответ написан
  • Зачем тут apply (если и без него работает)?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Чтобы привязать намертво к функции контекст (this). Иначе он потеряется.
    Ответ написан
    1 комментарий
  • Как понять эти две стрелочные функции в then, что за синтаксис?

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

    () => this.setState({
      signed: true,
      isLoading: false
    }
    // то же самое, что
    var that = this;
    function() {
      that.setState({
        signed: true,
        isLoading: false
      };
    }
    Ответ написан
  • Как при помощи JS cделать?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Возможно, задача покажется проще, если из первых двух массивов сделать "словари", где ключи id, а значения name.

    Второй массив задаёт строки таблицы, первый – столбцы. Вложенный цикл.
    Ответ написан
    Комментировать
  • Можно ли этот пример упростить до одного регулярного выражения?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Регулярные выражения «под капотом» не так легки, как выглядят. Там те же циклы, память.

    Данную задачу можно решить посимвольным чтением с занесением открывающих скобок в буфер FILO (First In - Last Out, Первым вошёл, последним вышел). И изъятием из буфера, с хвоста, закрывающих. До первой ошибки или до конца строки. В любой момент открывающая скобка ОК, пушится в буфер. Закрывающая ОК только, если соотв. ей открывающая – последняя в буфере. И в конце убедиться, что буфер пуст - каждой открытой нашлась пара.

    Решение, тесты проходит
    function verify(text) {
      const buffer = [];
      const valid = '()[]{}';
    
      for (let i = 0, len = text.length; i < len; i++) {
        const c = text[i];
        const idx = valid.indexOf(c);
        if (-1 === idx) continue; // не скобка
        if (idx & 1) { // закрывающая (нечет)
          if (0 === buffer.length) return false;
          if (valid.indexOf(buffer.pop()) + 1 !== idx) return false;
        } else { // открывающая
          buffer.push(c);
        }
      }
      
      return buffer.length === 0;  
    }

    Тесты
    (()=>{
    const tests = [
      ["a(b)", true         ],
      ["[{}]", true         ],
      ["[(]", false         ],
      ["}{", false          ],
      ["z([{}-()]{a})", true],
      ["", true             ],
      ["(((}", false        ],
    ];
    
    return JSON.stringify(
      tests.map(t => (verify(t[0]) === t[1] ? 'OK' : 'FAIL' ) + ': ' + t[0])
      , null,  
      2
    );
    })()
    
    
    /*
    [
      "OK: a(b)",
      "OK: [{}]",
      "OK: [(]",
      "OK: }{",
      "OK: z([{}-()]{a})",
      "OK: ",
      "OK: (((}"
    ]
    */
    Ответ написан
  • Как правильно выводить шаблон js через цикл?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    1. в приведённом фрагменте отсутствует метод appendChild(), упомянутый в ошибке.
    2. innerText это не метод, а свойство.
    3. чтобы в цикле не перезаписывались, а накапливались элементы, надо складывать.

    .then(function(result) {
      const el = document.querySelector('.response');
      let html = ''; // здесь соберём html всех блоков из цикла
      for(let i = 0, len = result.data.length; i < len; i++){
        const data = result.data[i];
        html += ` ... <img src="${data.logo}"> ... `;
      }
      el.innerHTML = html;
    })
    Ответ написан
    2 комментария