• Как распарсить такой JSON?

    Immortal_pony
    @Immortal_pony Куратор тега JavaScript
    но я никак не могу с ним работать, я пытался пропускать его через функции нормализации, но ни в какую

    А не надо бездумно совать свою строку какому-то левому коду и ожидать что он всё за тебя сделает.
    Надо проанализировать что ты получаешь и только потом начинать что-то делать.
    В данном случае видно две очевидные проблемы:
    1. В строке отсутствуют все закрывающие символы, которые должны быть в конце строки - кавычки, фигурные скобки, квадратные скобки - всё потеряли. В первую очередь надо найти того кто это написал, ткнуть его носом и громко и чётко произнести: "кто накодил? Кто накодил, а?", после чего посадить его исправлять серверную часть.
    2. Внутренний объект зачем-то закодирован в json второй раз. Тут уже можно не кричать, а дать лёгкого добродушного пинка backend-разработчику, но таким образом чтоб после этого его тело двинулось в сторону клавиатуры, используя которую, он исправит и этот косяк.

    const weirdString  = fetch() // здесь получаешь свою странную и  корявую строку
    const jsonEncoded = weirdString + '\\"}]}]"}' // для примера я вручную посчитал всё закрывающее барахло, но, возможно что для этого надо будет написать отдельную функцию. Ну, тут сам справишься, я думаю
    const decodedOnce = JSON.parse(jsonEncoded) // раскодируем первый раз
    const decodedTwice = JSON.parse(decodedOnce['21']); // раскодируем второй раз внутренний объект.
    Ответ написан
    Комментировать
  • Vue вычислить и вписать новое свойство в обьект(this.$set is not a function)?

    IceRD
    @IceRD
    computed - должен выполнять только вычисление и возвращать результат, он не должен мутировать данные.
    Для изменения данных используйте methods или watch
    Ответ написан
    Комментировать
  • На собеседовании сказали, что не все функции - замыкания. Так ли это?

    snaiper04ek
    @snaiper04ek
    Не стреляйте в эникея, он админит как умеет
    парень. Всё равно ты будешь использовать ту терминологию, которую используют на работе. Если там под замыканием подразумевается замыкание с инкапсуляцией, то после того как тебе сказали что "твой код - говно", было два варианта: 1)поговорить о терминах либо со ссылкой на официальную документацию, либо вместо с собеседником вывести определение исходя из смысла понятия, не прибегая к авторитетам вообще. 2) Сказать о том, что прочитал такое определение у %авторитет%, и сказать, что готов использовать то, которым пользуетесь вы на работе.

    По поводу выведения определения: есть смысл замыкания. Его нужно чётко озвучить согласиться с ним. Например, ты хочешь сказать, что смысл замыкания это ничто иное как "повесить ссылку на переменную с которой окончена работа до объявления функции, для сейва от мусорщика". Спросить - согласен ли с этим собеседник, или есть дополнения/возражения. Если согласен - значит "функция, являющаяся замыканием - любая функция, которая ссылается на переменную вне своего тела, в случае если переменную иначе удалил бы сборщик." Далее нужно договориться, что "иначе удалил бы" можно опускать как лишнюю сущность, которая усложняет определение такой функции, и упростить до - "функция, ссылающаяся на переменную вне своего тела."

    Есть второй вариант: собеседник тебе говорит: "Ахтунг! Замыкание используется не просто для того, чтобы спасти переменную от удаления! Это ещё и способ сокрытия данных: замыканием можно использовать локальную глобальную переменную, вместо того чтобы использовать просто глобальную переменную, или же городить отдельный класс."
    В этом случае всё твое определение идёт в пешее эротическое, и ты соглашаешься, что для этого придётся обернуть функцию в функцию, чтобы у тебя была функция с локальными переменными, которые будут глобальными для этой функции в функции.
    Ответ написан
    13 комментариев
  • Styled components или БЭМ?

    @karminski
    Senior React.JS Developer
    Ответ написан
    Комментировать
  • Как сделать cекундомер без setInterval и setTimeout?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Я за RAF! : )

    let rafSeconds = 0;
    const rafStart = Date.now();
    const tick = () => {
      const seconds = (Date.now() - rafStart) / 1000 | 0;
      if (rafSeconds !== seconds) { // секунды изменились!
        rafSeconds = seconds;
        // TODO: отрисовать новые секунды
      }
      window.requestAnimationFrame(tick);
    }
    
    tick();
    Ответ написан
    2 комментария
  • Как обернуть элементы, между триггерных элементов?

    hahenty
    @hahenty
    ('•')
    wd = document.createElement( 'div' );
    document.querySelectorAll( 'p.start ~ p:not( p.end ~ p, p.end )' ).forEach( p => wd.append( p ) );
    document.querySelector( '.blocks' ).insertBefore( wd, document.querySelector('.end') );
    Ответ написан
    Комментировать
  • Как из массива рандомных натуральных чисел вычислить две равные суммы?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Это задача - вариант Subset sum problem.

    Она NP-полная - тут нет быстрых и простых решений. В общем случае, возможно только решение полным перебором за N*3^N. Что-то вроде того, что предложил Alexandroppolus, только там вообще не рассматривается случай, что текущее число просто пропускается. Еще можно делать это же без рекурсии на основе битовых масок.

    Если есть какие-то дополнительные условия (например, все числа очень маленькие), то может более быстрым быть решение на основе динамического программирования, как в задаче о рюкзаке.
    Ответ написан
    1 комментарий
  • Как оптимально перебрать все возможные комбинации 4х массивов?

    @rPman
    ip4 адрес это число 32бит, все ip адреса тут это все значения unsigned int32 от 0 до 0xFFFFFFFF
    т.е. пишешь один единственный цикл от 0 до 0xFFFFFFFF а затем из числа получаешь ip в нужном тебе виде, либо последовательным получением остатка отделения на 256, либо вручную побитовыми операциями (маска и сдвиг) либо сконвертировав число в массив байт
    Ответ написан
    Комментировать
  • Как решить ошибку Cannot GET /solm?

    delphinpro
    @delphinpro
    frontend developer
    В любой непонятной ситуации ВСЕГДА сначала читай документацию.
    Особенно такую хорошую, как у вью.
    Вот этот раздел, до просветления: https://router.vuejs.org/ru/guide/essentials/histo...
    Ответ написан
    Комментировать
  • Агрегация сетевых каналов?

    gbg
    @gbg Куратор тега Компьютерные сети
    Любые ответы на любые вопросы
    Все правильно. Два гигабита между двумя конкретными хостами можно получить только при политике Round-Robin, (когда пакеты по очереди попададают то в один, то в другой сетевой интерфейс).

    Венда и циско это не поддерживают - только линукс и микротик.

    В остальных случаях, вы будете иметь ускорение для доступа от разных хостов (потому что при политике разделения по макам, которая является дефолтной, пакеты в интерфейсы будут попадать в зависимости от MAC)
    Ответ написан
    1 комментарий
  • Нужно ли оборачивать сбор данных из формы в promise?

    Stalker_RED
    @Stalker_RED
    Нет, не нужно делать ее асинхронной, из формы и синхронно получится данные собрать.

    1. Если вдруг вы переделаете форму так, чтобы у полей были name, то можете выбросить функцию getSaveData и использовать $(form).serialize();

    2. сбор данных не обязательно записывать в переменную, да еще и объявленную через let. Можно делать прямо вот так:
    $.ajax({
        url: 'www.expample.ru/file.php',
        type: 'POST',
        data: { data: getSaveData() },  // переменная data не нужна
        // ...
    })


    или, если у ваших полей есть имена
    $.ajax({
        url: 'www.expample.ru/file.php',
        type: 'POST',
        data: { data: $(form).serialize() },
        // ...
    })

    и можно использовать встроенный в браузер способ
    $.ajax({
        url: 'www.expample.ru/file.php',
        type: 'POST',
        data: { data: new FormData(form) },
        // ...
    })


    Кроме того, довольно странно делать отправку данных только по клику по кнопке. Обычно формы также отправляются при нажатии enter, и она таки отправится средствами самого браузера, "мимо" вашего ajax-ового отправлятора.

    Соответственно правильнее будет куак-то так:
    const $form = $("#idForm");
    $form.on('submit', function(evt) {
        evt.preventDefault(); // отмена обычной отправки
        
        $.ajax({
               type: "POST",
               url: $form.attr('action'),
               data: $form.serialize(),
          // ...


    А если вам вдруг не нужна поддержка очень старых браузеров, то можно вообще выбросить jQuery
    const form = document.getElementById('myForm');
    
    form.addEventListener('submit', function(evt){
      evt.preventDefault();
      fetch(form.action, {
        method: 'POST',
        body: new FormData(form)
      });
    });

    https://developer.mozilla.org/ru/docs/Web/API/Fetc...
    Ответ написан
    2 комментария
  • Как написать подобный функционал на node js (express)?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    node.js и express тут не причем, а вот что при чем - так это БД, а Вы не указали, какую БД используете.
    В большинстве БД, которые умеют unique, используют для этого индексы, а индексы можно строить не только по 1 полю, но и по группе полей. В вашем случае unique index должен состоять из двух полей - user_id и task_id, что сделает их уникальными именно в паре.

    P.S. мне кажется не очень хорошая идея давать юзеру самому задавать id, особенно для тех сущностей, что юзер может создавать более одной.
    Ответ написан
    Комментировать
  • Как реализовать такой блок?

    Ankhena
    @Ankhena Куратор тега CSS
    Нежно люблю верстку
    1 комментарий
  • Как сделать так чтобы доступ к backend api был запрещен?

    deepblack
    @deepblack
    Конечно можно, нужно отключить бэкенд. Тогда и доступа не будет
    Ответ написан
    Комментировать
  • Рендер только новых элементов при добавлении их в массив?

    0xD34F
    @0xD34F Куратор тега React
    key={elem * Math.random()}

    при добавлении новых 20 в массив перерисовываются ещё и старые 300

    нет слов
    5ce68e39b7718977335131.jpeg
    Ответ написан
    7 комментариев
  • Как вызвать метод vue используя onClick?

    @cheeroque
    Может всё-таки v-on:click.prevent?
    Ответ написан
    Комментировать
  • Почему typescript не видит пременные окружения?

    @askhat
    Читаем внимательно

    Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
      Type 'undefined' is not assignable to type 'string'.

    Разгадка

    process.env.DB_NAME может быть типа string или undefined, так как не факт, что переменные определены, а то место, куда DB_NAME вставляется ожидает строго строку.

    Решение

    Нужно проверять значение process.env.DB_NAME до того как оно будет передано конструктору:
    export const DB_NAME = process.env.DB_NAME ?? "default_database";

    Ответ написан
    2 комментария
  • Как вызвать действие, если ответ API больше X секунд?

    IonDen
    @IonDen
    JavaScript developer. IonDen.com
    Вам нужно параллельно запустить таймер и ваш запрос.
    Если запрос завершится раньше - очистите таймер и лоадер не покажется.

    let timerId = setTimeout(() => {
      // show loader
    }, 1000);
    
    fetch('API url').then((data) => {
      // prevent loader show
      clearTimeout(timerId);
    
      // show result
    });
    Ответ написан
    1 комментарий
  • Как создать коллекцию файлов FileList?

    @zkrvndm Автор вопроса
    Софт для автоматизации
    Лайфхак для создания коллекции файлов FileList:
    // Создадим простой текстовый файл:
    var data = 'Здесь текст для файла или положите в переменную Blob';
    var file = new File([data], 'primer.txt', {type: 'text/plain'});
    
    // Создаем коллекцию файлов:
    var dt = new DataTransfer();
    dt.items.add(file);
    var file_list = dt.files;
    
    console.log('Коллекция файлов создана:');
    console.dir(file_list);
    
    // Вставим созданную коллекцию в реальное поле:
    document.querySelector('input[type="file"]').files = file_list;

    В переменную data вместо текста, можно положить в том числе и Blob - это особенность функции new File() которая первым параметром может принять как массив из текстов, так и массив из Blob.

    Фактически лайфхак выше позволяет нам JavaScript-ом скачать любой какой угодно файл со своего сайта и вставить его абсолютно в любое поле <input type="file"> - что просто архиполезно для браузерных ботов.

    Также способ выше можно применить для редактирования уже выбранных пользователем файлов. Например, если надо из поля выбора файлов убрать какие-то определенные файлы и при этом не фиктивно, а реально.

    Огромное спасибо пользователю Mmx Symfony, который нарыл это решение где-то в недрах иностранных сайтов. Сам я в свое время сколько не искал везде был ответ, что это невозможно, а оказалось, что нихрена подобного =)
    Ответ написан
    8 комментариев