Ответы пользователя по тегу JavaScript
  • Как сделать программу для угадывания загаданных чисел 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 комментария
  • Как правильно добавить токен в Fetch Api?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Документация по fetch и Headers

    Рабочий код в браузере требует same origin
    const token = 'xxxxxx';
    var myHeaders = new Headers();
    myHeaders.append('x-access-token', token);
    
    var myInit = { method: 'GET',
                   headers: myHeaders,
                   mode: 'cors',
                   cache: 'default' };
    
    var myRequest = new Request('http://api.travelpayouts.com/v2/prices/latest', myInit);
    
    fetch(myRequest)
      .then(res => res.json())
      .then(data => console.log(data))
    Но в вашем случае ничего не получится из-за требования Same Origin: через JS в браузере что-то загружать с того сайта можно только страницам, загруженным с него же. Гуглите CORS. Или работайте через nodejs.

    Рабочий код под nodejs
    const http = require("http");
    
    const token = '321d6a221f8926b5ec41ae89a3b2ae7b';
    const url = 'http://api.travelpayouts.com/v2/prices/latest';
    
    http.get(
      url,
      {
          headers: {
          'x-access-token': token
          }
      },
      (res) => {
        const { statusCode } = res;
        const contentType = res.headers['content-type'];
      
        let error;
        if (statusCode !== 200) {
          error = new Error('Request Failed.\n' +
                            `Status Code: ${statusCode}`);
        } else if (!/^application\/json/.test(contentType)) {
          error = new Error('Invalid content-type.\n' +
                            `Expected application/json but received ${contentType}`);
        }
        if (error) {
          console.error(error.message);
          // Consume response data to free up memory
          res.resume();
          return;
        }
      
        res.setEncoding('utf8');
        let rawData = '';
        res.on('data', (chunk) => { rawData += chunk; });
        res.on('end', () => {
          try {
            console.log("raw data:", rawData);
            
            const parsedData = JSON.parse(rawData);
            console.log(parsedData);
          } catch (e) {
            console.error(e.message);
          }
        });
      }
      
    ).on('error', (e) => {
      console.error(`Got error: ${e.message}`);
    });
    Ответ написан
  • Как вывести данные из unixtime?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Unix time это целое число секунд с начала эпохи Unix, 1 января 1970.
    В JavaScript время считается не в секундах, а в миллисекундах (1/1000 секунды). Поэтому надо будет домножить на 1e3. Это время можно передать единственным параметром в конструктор объекта Date:
    var vkApiResponse = {
      "response": 1467726682
    };
    
    
    var D = new Date(vkApiResponse.response * 1000);
    D.toString() // Tue Jul 05 2016 16:51:22 GMT+0300 (Moscow Standard Time)
    Ответ написан
    Комментировать
  • Простейший калькулятор на js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    prompt() возвращает String, который надо привести к числу.
    Условие прекращения цикла возможно, не то, что вам на деле требуется, я бы ограничил число итераций:
    var a = +prompt('summa'), i = 0;
    for ( ; ++i<5; a *= 1.012) {
      console.log(`${i}: ${a}`); // смотрим в консоль
    }
    // ввёл 200
    // получилось:
    /*
    1: 200
    2: 202.4
    3: 204.8288
    4: 207.28674560000002
    */


    Ну и вспоминаем математику. Тут идёт умножение числа a на 1.012n раз. Сразу можно посчитать как 1.012 в степени n. Обратная задача - логарифм. Например, как узнать, сколько раз надо умножить на 1.012 сумму 20, чтобы получить 30:Math.log(30/20) / Math.log(1.012) // 33.991
    Ответ написан
  • Как понять синтаксис ES6?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Стрелочные функции это лаконичная запись функций и небольшие отличия с контекстом.
    arr.filter( (num) => num > 0 && num % parseInt(num) === 0 )
    
    // то же, что
    arr.filter( function(num) { return   num > 0 && num % parseInt(num) === 0 ;}  )

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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Без использования символа переменная handlers имеет значение undefined, которое тоже можно использовать как свойство объекта.
    const a = {};
    let b;
    a[b] = "test";
    
    JSON.stringify(a)
    // "{\"undefined\":\"test\"}"
    
    a[undefined] // "test"
    Ответ написан
    Комментировать
  • Как вызвать код функции?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Оберните код функции и вставьте его сразу в документ, не надо AJAX:
    const mySuperAnimationFunction = () => {
    
    // тут весь "код функции"
    
    }

    И когда нужно выполнить анимацию - доскроллили до места - вызывайте её: mySuperAnimationFunction();
    Ответ написан
    Комментировать
  • Как настроить таймер на javascript - время до открытия магазина?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно всё считать в локальной временной зоне. Известно смещение от UTC времени магазина. Текущее смещение посетителя от UTC получаем через getTimezoneOffset().

    Задача получить два объекта времени: открытия и закрытия магазина, во временной зоне браузера посетителя.

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

    Решение
    function tillItOpens() {
      const D = new Date();
      const shopOffsetMin = 5 * 60; // GMT+5
      const myOffsetMin = D.getTimezoneOffset();
      const diffMin = shopOffsetMin + myOffsetMin;
      
    
      function futureDate(hours, fixMin) {
        const d = new Date();
        d.setHours(hours);
        d.setMinutes(0 + fixMin);
        d.setSeconds(0, 0);
        if (d < new Date()) d.setDate(d.getDate() + 1);
        return d;
      }
    
      
      const dOpens = futureDate(9, diffMin);
      const dCloses = futureDate(21, diffMin);
    
      if (dOpens < dCloses) {
        // скоро откроется
        const hours = Math.floor((dOpens - D) / 36e5);
        const minutes = Math.floor((dOpens - D) / 6e4) - 60 * hours;
        
        return `до открытия ${hours}:${minutes}`
        
      } else {
        // сейчас открыто
        return "Сейчас открыто!";
        // хорошо ещё посмотреть, сколько остаётся до закрытия - успеет ли чел.
        // ближайшее закрытие – объект dCloses
      }
    }

    Если сейчас закрыт, запускайте таймер обратного отсчёта до объекта dOpens – он означает время открытия в текущей таймзоне.
    Ответ написан
    3 комментария