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

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Object.keys(object[key]) = newobject[key];
    Вот на этой строчке у Вас ошибка, в JS нельзя присвоить что-то любому выражению, только переменной или полю объекта.
    Ответ написан
    Комментировать
  • Почему в объекте Response нет самого ответа?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Промис возвращаемый fetch() не ждет завершения всего запроса, он резолвится когда получены все заголовки.
    На этом месте их можно обработать и решить что делать дальше, например читать json, текст или бинарные данные из тела, или вообще не обрабатывать тело и прервать запрос.
    Так же можно читать тело ответа в виде потока, как уже указал в своем ответе Надим Закиров

    Второй промис из response.text() и response.json() нужен чтоб дождаться считывания всего тела ответа, притом response.json() еще и позволяет браузеру парсить json из ответа потоково прямо во время скачивания, опять же не блокируя поток js/ui.
    Ответ написан
    5 комментариев
  • Как преобразовать curl с параметром --data в fetch с методом get?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Если данные передаются в url в виде GET параметров:
    const url = new URL('http://127.0.0.1:8000/api/feed/posts/');
    url.searchParams.append('page', 1);
    
    fetch(url, {
      headers: {
        Authorization: 'Token a96a3545bb566272f0fdfb405a0cccb7173da660',
      },
    });
    Ответ написан
    Комментировать
  • Как переписать промис через async/await?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Код на then ждет промис из wait, а код на await нет
    await wait(2);
    Ответ написан
  • Почему сообщения в консоль выводятся не по порядку массива?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Promise.all(arr.map(p => {
        const link = `http://195.112.117.82:5080/photo?tov_code_internet=${encodeURIComponent(p)}`;
        return new Promise(resolve => {
            $.get(link, resolve);
        });
    })).then(dataArr => {
        for (const data of dataArr) {
            const $obj = $(data);
    
            const content = $obj[19].innerHTML;
            const title =   $obj[7].innerText;
    
            // по хорошему регулярки надо вынести наверх,
            // чтобы они компилировались 1 раз
            const text = content
                .replace(/[\n\r]/g, ' ')
                .replace (/\s{2,}/g, ' ');
    
            console.log(text + " " + title);
        }
    }).catch(err => {
        console.error(err);
    });
    Ответ написан
    Комментировать
  • Как решить проблему с WebSockets?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Вы на каждый запрос по http, который обрабатывается Вашим middleware делаете подписку на websocket connection, тем самым плодите обработчики.
    У Вас вебсокет вообще никак не связан с http и сидит на отдельном порту.

    При желании, кстати можно переиспользовать инстанс http сервера и для express и для websocket, тогда они на одном порту будут.
    Ответ написан
    3 комментария
  • Почему ошибка Uncaught TypeError: Failed to construct 'URL': Invalid URL?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    const network = "http://localhost:8899";для solana-test-validator
    Или URL реальной сети, в которой крутится нужная программа, если продакшен
    Ответ написан
    Комментировать
  • Можно ли реализовать такое с помощью js?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Можно.

    Вариант 1: зашить html код блока строкой в JS и вставлять через DOM операции в страницу, например через insertAdjacentHTML.

    Вариант 2: использовать шаблонизаторы, такие как handlebarsjs, по сути то же, что и вариант 1, но еще и позволит просто подставлять данные в HTML.

    Вариант 3: использовать UI фреймворк или библиотеку, такие как svelte, vue или react.

    Ну и маленький совет, если у Вас будет отдельный скрипт, который чисто выводит Ваш header на страницу, то подключать его можно прямо в месте расположения header, но подключать его нужно с атрибутом async, что бы он не мешал загрузке остальной страницы. И вставлять HTML код в этом случае можно относительно тега script, получить который можно через document.currentScript
    Ответ написан
    Комментировать
  • Запутался в изучении JavaScript. С чего начать?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Ни одна книжка или видео курс не позволит Вам освоить язык программирования. Хорошие книжки или видео курсы помогут усвоить хорошие практики, но только когда Вы уже что-то умеете. Притом без базовых знаний невозможно отличить хорошие книгу/курс от полностью отвратительных.

    Придумайте проект, который был бы полезен лично Вам или кому-то из близких/друзей/знакомых, и который Вам было бы интересно сделать. И просто начните его делать, гугля каждый раз, когда не знаете как сделать ту или иную вещь, а если не получается ничего нагуглить, то можно задать вопрос здесь. В начале Вы будете гуглить на каждый чих, это нормально. Но чем ближе Ваш проект будет к рабочему состоянию, тем реже Вам придется гуглить. Кроме того, если сразу делать такой проект фиксируя все изменения в git и выкладывая на githab, это сильно Вас выделит при поиске первой работы среди тысяч других новичков, но с проектами с курсов под копирку.
    Ответ написан
  • Как дождаться загрузки iframe который формируется javascript?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Ответ написан
    Комментировать
  • В чем моя ошибка stepik?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    произведение элементов массива
    let p = 1;
    // в цикле:
    p *= arr[i];


    кратных 3
    n % 3 === 0

    оканчивающихся на 5
    n % 10 === 5

    если таких элементов нет
    в общем случае делается введением флага:
    let hasElements = false;
    
    if (/* ... */) {
      hasElements = true;
    }
    Но конкретно в этом случае, так как 1 гарантированно не попадает под условия, а все остальные числа изменят произведение, можно проще p !== 1

    Вам осталось дело за малым, объединить эти кусочки знаний в единый алгоритм
    Ответ написан
    Комментировать
  • Что сделать с большими аудиофайлами, чтобы их было удобно слушать на веб-странице?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Я бы пошел путем разбиения файла на куски, это кстати можно автоматизировать через ffmpeg.
    Так же лучше сохранять информацию о всех кусках и их продолжительности (например в json).

    Для непрерывного воспроизведения стоит создавать новый audio и вставлять его на страницу за некоторое время до окончания воспроизведения текущего куска. Отслеживать время можно через событие timeupdate.
    По завершению текущего куска (событие ended) запускать следующий, а элемент audio текущего удалять из страницы.

    Если нужен ползунок, эмулирующий полный файл, то можно сделать кастомный используя информацию из json. Хотя для личного пользования я лично не стал бы заморачиваться и просто вывел бы кнопки для переключения на нужный кусок, все так же на основе информации из json.
    Ответ написан
  • Почему не работает цикл?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Во-первых, у Вас ошибка синтаксиса
    https://developer.mozilla.org/ru/docs/Web/JavaScri...

    Во-вторых, а что Вы пытаетесь добиться, запуская setInterval в цикле, а в setInterval еще один setInterval?
    Ответ написан
  • Не понимаю последовательность выполнения цикла?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Для начала почитайте вот это:
    https://developer.mozilla.org/ru/docs/Web/JavaScri...

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

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Дата не меняется, просто Вы оперируете датой в текущем часовом поясе (Московское время), а в консоль логируется в формате UTCString, а в UTC всегда используется время по Лондону.

    Ну и у строки нет метода setHours, нужно сначала создавать объект Date и уже на нем вызывать этот метод. Хотя для даты сделаной из такой строки этот вызов бессмысленный, так как устанавливаемые параметры и так будут 0
    Ответ написан
    2 комментария
  • Как упростить проверку числа на палиндром и увеличить скорость выполнения кода?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Задача проверки последовательности на палиндром решается за O(n/2). Но для этого нужно иметь последовательный доступ к обоим концам последовательности за O(1).
    Если такой возможности нет и имеется доступ только к одному из концов последовательности, то придется обойти всю последовательность, а это уже O(n). Один из таких, достаточно оптимальных алгоритмов для цифр целого числа уже представил WbICHA.

    Чтоб решить эту задачу за O(n/2) нужно понять, как получить крайние цифры числа за O(1).
    Крайнюю справа цифру можно получить простым остатком от деления на основание системы счисления, то есть, в случае десятичной системы счисления, на 10.
    Для получения крайней справа цифры нужно знать ее порядок (считая справа начиная с 0). Это можно сделать взяв целую часть от логарифма по основанию системы счисления (10). На JS такая операция будет выглядеть так:
    Math.trunc(Math.log10(num))
    Целая часть от деления числа на 10 в степени порядка правой цифры даст саму эту цифру. На JS это выражается так:
    Math.trunc(num / 10 ** Math.trunc(Math.log10(num)))

    Так же алгоритм требует равномерного перемещения по последовательности от краев к центру.
    Для правой цифры опять все просто, можно брать целую часть от деления числа на основание (10).
    Для левой нужно умножить ее на основание в степени порядка и вычесть результат из самого числа, то есть:
    num - leftDigit * 10 ** Math.trunc(Math.log10(num))


    Осталось учесть пограничные условия:
    1. Если крайний левый и крайний правый элемент не равны, то последовательность не является палиндромом
    2. Последовательность из одного элемента (число из одной цифры) всегда палиндром.
    3. При равенстве крайних элементов последовательность будет палиндромом если палиндромом так же является подпоследовательность без этих элементов.

    Пункт 3 подразумевает рекурсию, но такая рекурсия легко разворачивается в цикл, что конечно же более оптимально.

    По итогу получим такую функцию:
    const isPalindrome = num => {
        let n = num;
        while (n >= 10) {
            const order = 10 ** Math.trunc(Math.log10(n));
            const leftDigit = Math.trunc(n / order);
            const rightDigit = n % 10;
            if (leftDigit !== rightDigit) return false;
            n -= leftDigit * order;
            n /= 10;
            n = Math.trunc(n);
        }
        return true;
    };


    P.S. варианты с приведением числа к строке, а тем более с последующим разбиением на массив чисел и разворотом его, просто отвратительны.
    Приведение числа к строке - это O(n) если не больше, так как в JS тип number - это по сути float64 и алгоритм приведения учитывает, что число может быть с дробной частью.
    Разбиение строки на массив символов (split) - O(n) и требует доп памяти под этот массив.
    Реверс массива - O(n/2)
    Склейка (join) - опять O(n)
    Сравнение строк - еще раз O(n)
    И хотя суммарная сложность останется O(n), количество проходов по цифрам числа будет в 5 раз больше, хотя даже на строках можно уложится в 1.5 обхода:
    const isPalindrome = num => {
        const s = String(num);
        for (let i = 0; i < s.length / 2; i++) {
            if (s[i] !== s[s.length - i - 1]) return false;
        }
        return true;
    };
    Ответ написан
    4 комментария
  • Как переключить подсветку на следующий элемент списка при нажатии стрелок вверх-вниз?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Ну для начала, вот сюда:
    list.addEventListener('keydown', function(parentLi) {
    параметром придет KeyboardEvent, в котором есть данные о нажатых клавишах.

    По идее в цикле перебираются li с классом parent, и у того, который должен быть подсвечен добавляется к классу пометка active
    Хранить состояние во view слое очень плохая идея. Запоминайте индекс выделенного элемента в переменной и по событию проверяйте возможность переключения подсветки и меняйте классы.

    Ну и так, замечание:
    for(var i = 0; i < parentLi.length; i++) {
        light(parentLi[i].firstChild)
    }
    
    function light(parentLi) {
        parentLi.addEventListener('mouseover', function() {
            this.style.color = 'pink';
            this.style.backgroundColor = 'grey';
        })
        parentLi.addEventListener('mouseout', function() {
            this.style.color = 'black';
            this.style.backgroundColor = 'white';
        })
    }
    вот тут в цикле создается целая пачка однотипных функций, каждая из которых будет жрать память пользователя. Притом эта задача вообще легко решается на чистом CSS через hover.
    Ответ написан
  • Как правильно копировать интерфейс и переносить функции, события в TypeScript?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    1. У Вас переменная design нигде не объявлена, откуда она должна взяться-то? Аналогично будет с другими переменными: designActive, designNoActive, development, developmentActive, developmentNoActive, promotion, promotionActive, promotionNoActive
    2. Что мешает просто сделать import?
    Ответ написан
    1 комментарий
  • Регулярное выражение url?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Не нужны здесь регулярки.
    https://developer.mozilla.org/ru/docs/Web/API/URLS...
    Ответ написан
    Комментировать