Задать вопрос
  • Как добавить элемент в массив в объекте react?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const { duration } = filter;
    
    setFilter({
      ...filter,
      [ ...duration, 1, 2, 3 ], // добавили в массив 1, 2 и 3
    });
    
    // теперь state станет
    // { type:"", duration: [1, 2, 3] }
    Ответ написан
  • Что происходит на этих строчках?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    поцитирую документацию:
    Для того, чтобы объект был итерируемым, в нем должен быть реализован метод @@iterator, т.е. этот объект (или любой из объектов из его prototype chain) должен иметь свойство с именем Symbol.iterator:
    Свойство: [Symbol.iterator]
    Значение: Функция без аргументов, возвращающая объект, соответствующий iterator protocol.


    Метод может вернуть объект типа { next() { /* ... */ }}, или, как в вашем примере, метод next() определён на самом объекте, поэтому возвращается this.

    Подробно именно ваш пример расписан на learn.javascript
    Ответ написан
  • Как выбрать объекта с наивысшем свойством из коллекции?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    [...Collection.values()].sort((a, b) => a.guild.raw - b.guild.raw).pop()

    Я так понял, дан объект Map. Привести его значения к массиву. Отсортировать по значению guild.raw по возрастанию. Взять последний объект – он с наибольшим значением raw.

    Это не самый эффективный способ: проделывается много ненужных сравнений. Запись короткая, других преимуществ нет.

    Правильнее один раз пройти по массиву, откладывая элемент с наибольшим значением на каждом шаге. Что-то типа
    [...Collection.values()]
      .reduce((max, current) => max.guild.raw > current.guild.raw ? max : current)
    Ответ написан
    Комментировать
  • Почему у стрелочной функции из объекта контекст виндоу?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    На learn.javascript, например, неплохо написали:
    Стрелка => ничего не привязывает. У функции просто нет this.
    При получении значения this – оно, как обычная переменная, берётся из внешнего лексического окружения.


    В вашем примере с литералом объекта можно добавить для понимания:
    const obj = {
      w() {
        console.log('w', this);
      },
      x: function () {
        console.log('x', this);
      },
      y: this,
      z: () => {
        console.log('z', this);
      },
    };
    
    obj.w(); // obj
    obj.x(); // obj
    console.log('y', obj.y); // Window
    obj.z(); // Window


    Запись литерала объекта не создаёт свой контекст: на момент записи this тот же, что и снаружи:
    const a = this; // Window
    const obj = {
      b: this, // тоже Window 
    }
    
    a === obj.b // true
    Ответ написан
    1 комментарий
  • Возможно ли получить ссылку на текущую функцию изнутри функции?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    arguments.callee, но это свойство недоступно в strict mode. В частности, в модулях.

    Ну, или просто дайте функции имя, чего жадничать-то : )
    (function toster() {
      console.log(toster);
    })();
    Ответ написан
    1 комментарий
  • Насколько сложна эта задача?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Если дочитали документацию JavaScript до Set, то решение совсем простое: перевести массив в сет (останутся только уникальные значения), и сет обратно в массив.

    upd. неправильно понял задачу. Если надо вернуть только элементы, которых в исходном массиве ровно 1 штука, то надо видимо считать. Сделать объект, где ключи строки, значения число, сколько раз нашлись. { "кришна": 4, "харе": 4, ":-O": 1 }Оставить только те, где значения 1. Собрать в массив.

    Или оставить те, что с начала и с конца находятся только «здесь и сейчас»:
    const unique = arr => arr.filter((item, i) => i === arr.indexOf(item) && i === arr.lastIndexOf(item));
    Ответ написан
    Комментировать
  • Как каждый раз отправлять новый элемент массива?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    заведите переменную счётчик:
    let offset = 0;
    async function requestAndTreatment() {
      // ...
      const point = res.data[offset++];
      data.addData([[res.timestamp, point.open, point.high, point.low, point.close]]); 
    }

    вообще перепроверьте логику: мне кажется странным, что из данных API вы хотите с каждым разом брать следующую позицию. Как будто они одни и те же каждый раз. А как до конца дойдёте, что дальше?
    Ответ написан
  • Как сделать, чтобы работали все кнопки лайка?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    main.querySelectorAll('.element__button')
      .forEach(el => el.addEventListener('click', () => el.classList.add('element__button_active')));
    Ответ написан
    1 комментарий
  • Как обновить значение в object?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Если задача иметь каждый раз «актуальные» секунды,
    наверное, стоит сделать геттер для свойства second,
    который каждый раз будет вычислять значение:
    const timerObject = {
      DATE: new Date(),
      listDATE: {
        get second() {
          return new Date().getSeconds();
        },
      },
    };
    
    // читать, как обычно
    console.log( timerObject.listDATE.second );
    
    // через секунду
    setTimeout(() => console.log( timerObject.listDATE.second ), 1000); // на 1 больше

    Сеттер вроде при этой задаче и не требуется. Просто хочется получать каждый раз актуальное значение?
    Ну или ещё проще, сделайте просто метод:
    const timerObject = {
      DATE: new Date(),
      listDATE: {
        second: () => new Date().getSeconds(),
      },
    };
    
    // использование
    console.log( timerObject.listDATE.second() );
    Ответ написан
    1 комментарий
  • В чём ошибка в задаче?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Три подсказки.

    Проверить, что аргумент является строкой:
    typeof arg === 'string'
    // ещё можно длину проверить, а то, вдруг длинное пришлют
    arg.length === 1

    Проверить, что это буква и есть пара в другом регистре:
    arg.toLowerCase() !== arg.toUpperCase()
    // строка перевелась в разные кейсы

    В каком кейсе изначально была буква:
    arg.toUpperCase() === arg // значит, буква в верхнем регистре


    Из этих кирпичиков остаётся сложить домик. И чтоб не рухнул )
    Ответ написан
    1 комментарий
  • Как следить за статусом контейнеров?

    Если без внешних инструментов с бесплатным триалом и деньжищами за использование,
    можно через Docker API получать живой стрим событий. Отфильтровать в нём только интересующие, например, container=<string> когда имя интересующего контейнера известно и постоянно.

    Но вообще присмотритесь подробнее к опции restart – пусть контейнер перезапускается автоматом после падения. И может, при запуске как-то куда-то отправляет «Доброе утро, админ!»
    Ответ написан
    Комментировать
  • Не понимаю, как это работает?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Просто прочитайте документацию или ещё что-то про сортировку.

    Вопрос «что здесь принимается за a, а что за b?» не самый удачный: в примере аргументы игнорируются.
    В этом странном коде возвращается всегда отрицательное число. Значит, результат сортировки массива зависит только от внутренней реализации — от того, в каком порядке будут сравниваться пары элементов.
    Ответ написан
  • Как динамически импортировать изображение?

    Модули импортируются статически, ещё до выполнения любого кода.

    Есть вариант динамического асинхронного импорта import(moduleName). Но у этого способа главный недостаток: WebPack соберёт в отдельный чанк все файлы с флагами, и бандл будет тяжеловат.

    Если хочется красоты, можно заморочиться и дописать модуль, где прописаны импорты и тут же экспорты всех флагов. Типа
    import ru from "svg-country-flags/svg/ru.svg";
    import ua from "svg-country-flags/svg/ua.svg";
    // ...
    
    // и там же экспорты:
    export ru;
    export ua;
    // ...

    Тогда достаточно будет одной строкой импортировать нужные флаги import { ru, ua } from './mySuperModule';И Webpack разберётся и включит в бандл только нужное.

    Когда напишете такой вспомогательный модуль, отправьте, пожалуйста, pull-request в тот репо.
    Ответ написан
    Комментировать
  • Как JS проверить на пустоту или создание объекта?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    элемент же может и отсутствовать?

    Тогда document.querySelector("#******") вернёт undefined, и попытка получить из него свойство innerText выкинет ошибку. Загляните в консоль.

    Наверное, нужно проверять два условия: чтобы и элемент нашёлся, и чтобы текст в нём оказался не пустой строкой.

    Что-то типа
    const el = document.querySelector("#******");
    if (el) {
      const a = el.innerText;
      if (a.length === 0) {
        el.value = "123"; // а что это за элемент, у которого и innerText и value ?
      }
    }
    Ответ написан
    Комментировать
  • Как запустить Nginx балансировщик, если host not found in upstream?

    попробуйте через переменную:
    map $scheme $upstream_main {
      default app;
    }
    
    upstream bundle {
        server $upstream_main;
        server fallback backup;
    }
    Ответ написан
  • Как отслеживать смену значений в объекте?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const obj = { name: 'Boris', age: 5};
    
    // переназначить свойство с геттерами и сеттерами
    // ниже очччень сокращённый пример
    Object.defineProperty(obj, "name", {
      set(newName) {
        console.log("Name changed to", newName);
      }
    });
    
    // проверяем:
    obj.name = "Toster"; // в консоль выведет "Name changed to Toster"
    на деле нужно сохранить начальное значение, где-то хранить значение свойства name, и добавить геттер. Т.к. вероятно, не единственное свойство захочется так подменить, лучше будет воспользоваться «оптовым» Object.defineProperties() или в цикле по свойствам объекта каждое сделать реактивным интерактивным.

    Подробнее см. примеры для Object.defineProperty()
    Ответ написан
    2 комментария
  • Почему не отрабатывает forEach?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Дело в том, у какого объекта вызывать метод forEach()

    Сейчас, очевидно, вызываете на массиве или статичном NodeList'е, в который свежедобавленный элемент не попадает.

    Почувствуйте разницу между статичным и динамическим NodeList'ом. Первый содержит только те элементы, которые в него попали на момент создания. Динамический будет содержать и добавленные после.

    querySelectorAll() возвращает статичный набор.

    Решение, в общем – либо заново собирать элементы, и по ним запускать forEach(), или же получать динамическую коллекцию, используя соотв. метод.
    Ответ написан
    Комментировать
  • Как уменьшить количество таблиц-справочников с тремя-четырьмя строками?

    Для коротких списков есть тип данных: ENUM.
    Поддерживается, например, в MySQL, Postgres.

    Идеально подойдёт для:

    1. Статусы заказа (открыт/выпущен/закрыт и т. п.)
    2. Статусы сборки заказа (ожидает сборки, сборка начата, сборка проверена, сборка завершена)
    3. Формула оплаты заказа (тут много вариантов)
    4. Фонд оплаты (собственные средства, федеральный бюджет, территориальный и т. п.))
    5. Внутренний клиент (одно из возможных внутренних ООО)
    6. Ответственный сотрудник
    7. Территориальный сектор
    8. Направление

    Ответ написан
    1 комментарий
  • В каком порядке выполняется этот код?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    1. объявили функцию
    2. зарядили первый таймаут: он через 1 секунду вызовет showNumber(1)
    3. ... пауза 1c, ничего не происходит
    4. вызвалась showNumber(1) - вывела в консоль "1", и зарядила новый таймаут, уже с showNumber(2). Убедились, что 2 не равно 6.
    5. ... пауза 1с, опять скукота, ничего не происходит
    6. вызвалась showNumber(2), вывели в консоль "2", зарядили таймаут (3)
    7. ... ... ...
    8. наконец поднялся счётчик до 5. Всё то же: зарядили таймаут, прошла 1 секунда,
      вызвалась showNumber(5)
      Тоже выводит в консоль "5", заряжает таймаут (6), но на этот раз срабатывает условие 6 === 6, и раз так — тут же гасит свежезаряженный таймаут, ибо нечего ему срабатывать.
    9. Занавес.


    Наверное, не уловили пока, как работает setTimeout(). Вызов setTimeout() отрабатывает сразу и выполнение идёт дальше. Но этот вызов не выполняет, а лишь откладывает на потом – задачу вызова какой-то функции с параметрами.

    Пишет письмо с заданием, запечатывает в конверт и относит на почту. И идёт дальше по своим делам. А когда-то там письмо дойдёт, наконец – его распечатают и выполнят задание.
    Ответ написан
    Комментировать
  • Какой выбрать сервис для создания минималистического веб-сайта?

    sergiks
    @sergiks Куратор тега Веб-разработка
    ♬♬
    github pages
    Если я правильно понял, сайт — статичный.
    Ответ написан
    Комментировать