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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Удалить все:
    Object.keys(items).forEach(key => delete items[key]);
    Ответ написан
    Комментировать
  • Как сделать условие в Node?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    async requestToSuip(suip, num_oper = '') {
      const exampleData = {
        result: false,
        requisite: "",
        amount: 0,
        created: null,
        suip: null
      };
    
      const url1 = "http://api-1/sber/cashout/suip/" + suip;
      const url2 = "http://api-2/sber/cashout/txnid/" + num_oper;
    
      const {data: data1} = await axios.get(url1);
      const isEqual = Object.keys(exampleData)
        .every(prop => exampleData[prop] === data1[prop]);
      if (isEqual === false) {
        return data1;
      }
      
      const {data: data2} = await axios.get(url2);
    
      return {
        ...data1,
        ...data2, // поля из data2 перезапишут такие же из data1
      };
    }
    Ответ написан
    Комментировать
  • Как в JavaScript менять глобальную переменную внутри функции?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно обращаться к глобальной переменной как к свойству универсального для браузеров / NodeJS / WebWorker'ов объекта globalThis

    function deep() {
      function veryDeep() {
        const inception = () => {
          // во глубине сибирских руд:
          globalThis.myGlobalVar = 'Habr'; // глобализм!
        };
        inception();
      }
      veryDeep();
    }
    deep();
    
    console.log(myGlobalVar); // "Habr"
    Ответ написан
    Комментировать
  • Как сделать чтобы рандом всегда давал новые значения?

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

    Совсем чуть-чуть заморочиться, и можно сделать, чтобы гарантированно никогда не шло одно и то же "случайное" значение два раза подряд.
    // random order in-place
    const shuffle = array => {
      for (let i = array.length - 1; i > 0; i--) {
        let j = Math.floor(Math.random() * (i + 1)); // random index from 0 to i
        [array[i], array[j]] = [array[j], array[i]];
      }
    };
    
    // init
    let coinIndex = -1;
    
    const button = document.querySelector('.button');
    button.addEventListener('click', () => {
      if (coinIndex < 0) {
        shuffle(coinFlip);
        coinIndex = coinFlip.length - 1;
      }
      console.log(coinFlip[coinIndex]);
      coinIndex--;
    });
    Ответ написан
    2 комментария
  • Как можно улучшить представленный код?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const func = (s, a, b) => Math.max(s.lastIndexOf(a), s.lastIndexOf(b));
    Ответ написан
    1 комментарий
  • Как удалить динамически созданный блок?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Удалить динамически создаваемый — искать прямо перед удалением.

    Вроде бы две функции отличаются только назначаемым id?
    const handleClick = id => () => {
      document.querySelector('.container_wrp')?.remove();
      const div = document.createElement('div');
      div.style.width = '700px';
      div.style.height = '500px';
      div.id = id;
      div.classList.add('container_wrp');
      wrpBlock.appendChild(div);
    };
    
    jccBtnJap.addEventListener('click', handleClick('jap_container'));
    jccBars.addEventListener('click', handleClick('stick_container'));
    тут handleClick() возвращает функцию, которая даёт создаваемому элементу переданный id.
    Ответ написан
    Комментировать
  • Являются ли компоненты `ux интерфейсом`?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    UI (user interface) — то, с чем непосредственно взаимодействует User: от фона сайта до кнопок, картинок и надписей.

    UX (user experience) — весь опыт/впечатления пользователя в процессе взаимодействия с брендом: от «впервые услышал от знакомых» до «зашел на сайт, всё понял, удобно нашёл, купил, подписался, обращался за обслуживанием/ремонтом, порекомендовал друзьям».

    Папки в своём проекте можете называть, как считаете нужным. Хорошо бы это было понятно другим разработчикам, которые попытаются разобраться с творением после вас. Вы же напишете исчерпывающую документацию, чтобы UX разработчиков был максимально позитивным? )
    Ответ написан
    Комментировать
  • Почему for..in не работает для коллекции Map?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Документация (только англоязычная версия) вроде бы, исчерпывающе объясняет:
    The for...in statement iterates over all enumerable properties of an object
    that are keyed by strings
    (ignoring ones keyed by Symbols),
    including inherited enumerable properties.


    Ожидаются свойства-строки. Map заточен под другое и позволяет использовать в качестве ключей что угодно, в том числе объекты. Значения добавленные в Map – это не его свойства в привычном смысле.

    Map, как и «всё в JavaScript» — объект. Поэтому можно взять и назначить ему свои свойства. Вот они вполне себе попадут в перечислёж for..in:
    const m = new Map();
    m.set({}, 'obj');
    m.set('a', 'A');
    
    // это другое
    m.b = 'B';
    
    for (let prop in m) {
      console.log('property', prop);
    }
    
    // property b
    Ответ написан
    Комментировать
  • Делаю SDK. Как объяснить пользователю, иммутабельный геттер или мутабельный?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Объект кота не в курсе требований иммутабельности стейта. Поэтому эти пляски лучше отложить туда же, где требуется иммутабельность.

    Как вариант, использовать immer, чтобы менять глубокие свойства, не беспокоясь об иммутабельности:
    import produce from "immer"
    
    const nextState = produce(this.state, draft => {
      // тут можно всё менять, не беспокоясь об иммутабельности
      const { catValue } = draft;
      catValue.cat.colors = Color.BLACK;
    });
    
    this.setState(nextState);
    или не весь стейт
    import produce from "immer"
    
    const { catValue } = this.state;
    const nextCatValue = produce(catValue, draft => {
      // тут можно всё менять, не беспокоясь об иммутабельности
      catValue.cat.colors = Color.BLACK;
    });
    
    this.setState({ catValue: nextCatValue });
    Ответ написан
  • Как скопировать прослушиватели событий с одно элемента на другой без jquery?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    cloneNode() сработает только если слушатели прописаны прямо в атрибутах элемента <a onclick="alert('Habr')">click me</a>

    Слушатели, добавленные элементу через addEventListener() скопировать можно примерно никак.

    Так что лучше держать обработчик отдельно, и навешивать их на элементы по мере надобности:
    function myClickHandler(event) {
      // что-то сделать по поводу клика
    }
    
    element1.addEventListener('click', myClickHandler);
    element2.addEventListener('click', myClickHandler);
    element3.addEventListener('click', myClickHandler);

    Или же слушать события выше по дереву, на общем родителе:
    <div id="parent">
      <button>1</button>
      <button>2</button>
      <button>3</button>
    </div>
    и слушать клики на div#parent
    Ответ написан
    Комментировать
  • Как добавить элемент в массив в объекте 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 комментарий