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

    WblCHA
    @WblCHA
    1. regexp
    2. ===
    3. >
    Ответ написан
    Комментировать
  • Как правильно вынести вывод за пределы цикла?

    WblCHA
    @WblCHA
    выводить в цикле не правильно

    Что выводить? Нифига не понял. Переписал на нормальный лад.
    const value = +input.value;
    const result = a.find((el) => el.includes(value));
    return out.innerHTML = result?.join(' ') ?? false;
    Ответ написан
    Комментировать
  • Как заменить весь текст начинающийся после #?

    WblCHA
    @WblCHA
    'index.html#4'.replace(/(?<=#).*/, 'about-us')
    Ответ написан
    Комментировать
  • Короткая автозамена undefined в Javascriprt?

    WblCHA
    @WblCHA
    А в чём проблема открыть консоль в браузере и проверить? Это явно раз в 100 быстрее, чем создавать вопрос здесь и ожидать ответа.

    Что же касается самого ответа, то, конечно, можно и тернарником это делать, но в данном случае лучше так:
    const res = undefined || 'nodata';
    const res = undefined ?? 'nodata'; // для тайпскрипта и свежого жс
    Ответ написан
    6 комментариев
  • Как тут работает позитивная опережающая проверка?

    WblCHA
    @WblCHA
    Тут соль в проверки на наличие каждого из пула символов. Это можно переписать так:
    if(
    	/[a-z]/.test(str)
      && /[A-Z]/.test(str)
      && /\d/.test(str)
      && /^[a-zA-Z\d]{6,}$/.test(str)
    )
    Ответ написан
    1 комментарий
  • Прошу помощи с кодом кратности input на js?

    WblCHA
    @WblCHA
    [].forEach.call(qInputs,function(el){
    Зачем? У нодлиста есть свой форыч.

    function(){ ... }
    К чему они тут, когда есть стрелочные?

    var
    Вары? Какой сейчас год?

    if ( el.hasAttribute('data-step') == true && el.getAttribute('data-step') !== "" ) 
    // =>
    if(el.getAttribute('data-step'))


    parseInt("1");
    Серьёзно?

    function (e) {
                e.preventDefault();
                if ( el.hasAttribute('data-step') == true && el.getAttribute('data-step') !== "" ) {
                    var part = parseInt(el.getAttribute('data-step'));
                } else {
                    var part = parseInt("1");
                }
                if ( el.hasAttribute('data-max-quantity') == true && el.value >= parseInt(el.getAttribute('data-max-quantity')) && parseInt(el.getAttribute('data-max-quantity')) != 0  ) {
                    var count = parseInt(el.getAttribute('data-max-quantity'));
                } else {
                    var count = parseInt(el.value) + part;
                }
                el.value = count;
            }
    // =>
    (event) => {
      event.preventDefault();
      
      const { value } = el;
      const maxQuantity = parseInt(el.getAttribute('data-max-quantity')) || 0;
      
      el.value = 
        maxQuantity > 0 && value >= maxQuantity 
      	? maxQuantity
      	: value + (parseInt(el.getAttribute('data-step')) || 1);
    }


    count = count < part ? part : count;
    el.value = count;

    А что мешало сразу в value записать?

    if (this.value.match(/[^0-9]/g)) {
                    this.value = this.value.replace(/[^0-9]/g, '');
                }

    Для чего тут 2 раза проходить?

    parseInt(this.getAttribute('data-step')) == ""  || this.value <= "1"

    Серьёзно? Ты вообще в курсе что такое число и как оно выглядит?

    В общем, да... Работоспособность не проверял, но тут итак проблем хватает.
    Ответ написан
  • Регулярное выражение - как удалить все до символа, пропустить букву и удалить все остальное?

    WblCHA
    @WblCHA
    А зачем удалять?
    "/srv/resources/ds_demo12/image_%l.jpg".match(/%./)[0];


    url.replace(/.*(%.).*/, (str, substr) => **********)
    Ответ написан
    8 комментариев
  • Как отсортировать массив массивов строк в js?

    WblCHA
    @WblCHA
    Раз такое дело, Дмитрий Беляев, Роман, оцените.)
    (() => {
      const orderArray = (arr) => {
        const itemsForMap = arr.map((items) => ([items[0], { items, prev: undefined }]))
        const itemsMap = new Map(itemsForMap);
    
        let last;
        itemsMap.forEach((node) => {
          const next = itemsMap.get(node.items[1]);
          if(next) {
            next.prev = node;
          }
          else {
            last = node;
          }
        });
    
        const result = [];
        result.length = arr.length;
    
        let current = last;
        for(let i = result.length - 1; i > -1; i--) {
          result[i] = current.items;
          current = current.prev;
        }
    
        return result;
      };
      
      return orderArray([['butter', 'jelly'], ['bananas', 'apples'], ['peanuts', 'butter'], ['jelly', 'bananas']]);
    })()

    Вроде всё верно, но я это в 7 утра перед сном писал...
    Ответ написан
    1 комментарий
  • Как вернуть объект в котором есть асинхронный map?

    WblCHA
    @WblCHA
    Если без объекта, то все работает

    Естественно работает, там вообще другая логика. Можно же было её скопировать.
    const items = await news.getRawMany();
    
    return {
     items: await Promise.all(items.map(async item => {
      let category = await this.getCompanyNewsCategory(item['category_id']);
      return {
        id: category,
      }}))
    };
    Ответ написан
    Комментировать
  • Как вернуть значение, а не промис?

    WblCHA
    @WblCHA
    Никак.
    Эвейты используются в асинхронных функциях, асинхронные функции всегда возвращают промис.
    Соответственно при вызове функции ты её должен ждать (эвейт).
    Ответ написан
    5 комментариев
  • Как работает данный код обработчика?

    WblCHA
    @WblCHA
    function ask(question, ...handlers) {
    https://www.samanthaming.com/tidbits/20-destructur...

    let isYes = confirm(question);
    alert(isYes)

    Объявление переменной и вызов функций.

    for(let handler of handlers) {
    https://developer.mozilla.org/ru/docs/Web/JavaScri...

    if (handler.length == 0) {
            if (isYes) handler();
          } else {
            handler(isYes);
          }

    Бесполезная проверка. Если функция не принимает аргументы, то никакой ошибки от передачи ей аргумента не будет.

    ask("Вопрос?", () => alert('Вы ответили да'), result => alert(result));

    Вызов функции с объявлением калбеков внутри.
    https://learn.javascript.ru/callbacks
    Ответ написан
    Комментировать
  • Почему функции могут не работать?

    WblCHA
    @WblCHA
    requestAnimationFrame(grav);
    И какие у грав аргументы будут при вызове?
    Ответ написан
    2 комментария
  • JavaScript: как округлять числа с такой логикой?

    WblCHA
    @WblCHA
    Не знаю, почему был удалён предыдущий ответ, но он был верен для данной задачи.
    Умножить число на 10000, округлить и поделить на 10000.
    Ответ написан
    7 комментариев
  • Как проверить элементы массива на совпадение?

    WblCHA
    @WblCHA
    Типо так:
    const baseArr = [
        [2, 2, 3, 9, 7],
        [6, 2, 4, 5, 8],
      ];
    
      const multDoubles = (arr) => {
        const counted = arr.reduce((acc, num, i) => {
          if(acc.has(num)) {
            acc.get(num).push(i);
            return acc;
          }
          acc.set(num, [i]);
          return acc;
        }, new Map);
    
        const multedArr = [...arr];
        counted.forEach((indexes, num) => {
          if(indexes.length > 1) {
            const newNum = num * indexes.length;
    
            indexes.forEach((i) => {
              multedArr[i] = newNum;
            })
          }
        });
    
        return multedArr;
      };
      
      const result = baseArr.map((arr) => multDoubles(arr));
    Ответ написан
    Комментировать
  • Как защитить кнопку от автоматического клика?

    WblCHA
    @WblCHA
    Если просто, то так:
    document.body.addEventListener('click', (e) => {
      if(!e.pageX && !e.pageY) {
        e.stopPropagation();
      }
    }, true);

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

    WblCHA
    @WblCHA
    Хз насколько это по феншую, но, насколько я помню, можно так:
    onClick={() => {
      handleClick(item);
      handleClick(item);
      handleClick(item);
      handleClick(item);
    }}
    Ответ написан
    3 комментария
  • Можете прокритиковать код?

    WblCHA
    @WblCHA
    Эх, жаль никто не ответил. Впрочем, я понимаю почему...
    spoiler

    let select = document.querySelector(".select-css");
    let vval = document.querySelector(".forfor");
    let pagiArea = document.querySelector('.pagination');

    const?

    function getSelectInfo(){
        let sql = '';
        if (select.value == "dateNew") {
            sql = 'SELECT * FROM "modScheme"."mod" ORDER BY "date_time" DESC';
        } 
    
        if (select.value == "dateOld") {
            sql = 'SELECT * FROM "modScheme"."mod" ORDER BY "date_time"';
        } 
        if (select.value == "size") {
            sql = 'SELECT * FROM "modScheme"."mod" ORDER BY "modSize" DESC';
        }
        return sql;
    }

    switch?
    Зачем тут переменная?
    Почему 3 ифа без элсов?

    pagi = pagi + '<a class="firstPagiHref"...'

    +=?

    Код
    function showPagination(pages, currentPage) {
        let pagi = '<a href="javascript://" onclick="duol(1)" class="firstPagiHref"><div id="pagiFirst">1</div></a><a class="firstPagiHref2"><div id="pagiTypical">..</div></a>';
        if (Number(currentPage) == 1) {
             pagi = pagi + '<a class="firstPagiHref" href="javascript://" onclick="duol(1)"><div id="pagiTypical" class="currentPagiPage">1</div></a>';
             if (pages >= Number(currentPage) + 1) {
                
                pagi = pagi + '<a class="firstPagiHref" href="javascript://" onclick="duol(2)"><div id="pagiTypical">2</div></a>';
             }
             if (pages >= Number(currentPage) + 2) {
                alert(pages);
                alert(Number(currentPage) + 2);
                pagi = pagi + '<a class="firstPagiHref" href="javascript://" onclick="duol(3)"><div id="pagiTypical">3</div></a>';
             }
             if (pages >= Number(currentPage) + 3) {
                pagi = pagi + '<a class="firstPagiHref" hhref="javascript://" onclick="duol(4)"><div id="pagiTypical">4</div></a>';
             }
             if (pages >= Number(currentPage) + 4) {
                pagi = pagi + '<a class="firstPagiHref" href="javascript://" onclick="duol(5)"><div id="pagiTypical">5</div></a>';
             }
             
        } else if (Number(currentPage) == 2) {
             pagi = pagi + '<a class="firstPagiHref" href="javascript://" onclick="duol('+(Number(currentPage) - 1)+')"><div id="pagiTypical">' + (Number(currentPage) - 1) + '</div></a>';
             pagi = pagi + '<a class="firstPagiHref" href="javascript://" onclick="duol('+Number(currentPage)+')"><div id="pagiTypical" class="currentPagiPage">'+Number(currentPage)+'</div></a>';
             if (pages >= Number(currentPage) + 1) {
                pagi = pagi + '<a class="firstPagiHref" href="javascript://" onclick="duol('+(Number(currentPage) + 1)+')"><div id="pagiTypical">'+(Number(currentPage) + 1)+'</div></a>';
             }
             if (pages >= Number(currentPage) + 2) {
                pagi = pagi + '<a class="firstPagiHref" href="javascript://" onclick="duol('+(Number(currentPage) + 2)+')"><div id="pagiTypical">'+(Number(currentPage) + 2)+'</div></a>';
             }
             if (pages >= Number(currentPage) + 3) {
                pagi = pagi + '<a class="firstPagiHref" href="javascript://" onclick="duol('+(Number(currentPage) + 3)+')"><div id="pagiTypical">'+(Number(currentPage) + 3)+'</div></a>';
             }
        } else {
            if (pages >= Number(currentPage) -2) pagi = pagi + '<a class="firstPagiHref" href="javascript://" onclick="duol('+(Number(currentPage) - 2)+')"><div id="pagiTypical">'+(Number(currentPage) - 2)+'</div></a>';
             if (pages >= Number(currentPage) -1) {
                pagi = pagi + '<a class="firstPagiHref" href="javascript://" onclick="duol('+(Number(currentPage) - 1)+')"><div id="pagiTypical">'+(Number(currentPage) - 1)+'</div></a>';
             }
             
             pagi = pagi + '<a class="firstPagiHref" href="javascript://" onclick="duol('+Number(currentPage)+')"><div id="pagiTypical" class="currentPagiPage">'+Number(currentPage)+'</div></a>';
             
             if (pages >= Number(currentPage) + 1) {
                pagi = pagi + '<a class="firstPagiHref"href="javascript://" onclick="duol('+(Number(currentPage) + 2)+')"><div id="pagiTypical" >'+(Number(currentPage) + 2)+'</div></a>';
             }
             if (pages >= Number(currentPage) + 2) {
                pagi = pagi + '<a class="firstPagiHref" href="javascript://" onclick="duol('+(Number(currentPage) + 3)+')"><div id="pagiTypical" >'+(Number(currentPage) + 3)+'</div></a>';
             }
        }
    
        pagi = pagi + '<a class="firstPagiHref2"><div id="pagiTypical">..</div></a>'+'<a href="javascript://" onclick="duol('+pages+')" class="firstPagiHref"><div id="pagiEnd">'+pages+'</div></a>';
    
        pagiArea.innerHTML = pagi;
        return (currentPage * 7) - 7;
    
        document.querySelector('#ya1').scrollIntoView({
          behavior: 'smooth',
          block: 'start'
        })
    }

    DRY?
    switch?
    Number(currentPage) всего-лишь 20 раз написал, вместо того, чтобы загнать в переменную. Да и почему не +currentPage?

    function getPagiInfo() {
        return new Promise(function (resolve, reject) {
            var request = new XMLHttpRequest();
        // Настройка запроса
        request.open('GET','/pagi/',true);
        request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        //Подписка на событие onreadystatechange и обработка его с помощью анонимной функции
        request.addEventListener('readystatechange', function() {
          // если состояния запроса 4 и статус запроса 200 (OK)
          if ((request.readyState==4) && (request.status==200)) {
           let objects = request.responseText;
           objects = Math.ceil(objects);
           let currentPage = document.querySelector('.currentPagiPage').innerHTML;
           let result = showPagination(objects, currentPage);
           resolve(result);
          }
        }); 
        // Отправка запроса на сервер
        request.send();
    });
     }

    DRY? Этот код почти 1 в 1 ещё пару раз повторяется ниже.

    function show(obj) {
        // расшифровываем json
        vval.innerHTML = "";
        let obj1 = JSON.parse(obj);
        
        for (let i=0; i<obj1.length; i++) {
            vval.innerHTML= vval.innerHTML + '<a href="#" class="hrefCar">'+'<div class="blockTypicalCar">'+'<div class="blockTitle">МОД '+obj1[i]['title']+' ДЛЯ BEAMNG.DRIVE</div>'+'<img src="/asset/other/images/beam.jpg" id="imageCarTipical">'+'<div class="otherContentCar">'+'<div class="someText">'+obj1[i]['textAbout']+'</div>'+'<hr>'+'<div class="infoIcons">'+'<div class="viewsCar"><img src="/asset/other/images/svg/preview.svg"> '+obj1[i]['watches']+'</div>'+'<div class="commentsCar"><img src="/asset/other/images/svg/comment.svg"> '+obj1[i]['comments']+'</div>'+'<div class="downloadsCar"><img src="/asset/other/images/svg/download.svg"> '+obj1[i]['downloads']+'</div>'+'</div>'+'<hr>'+'<a href="#" id="downloadHref" download><div class="donateHeaderButt secondButt"><button>Скачать</button></div></a>'+'</div>'+'</div>'+'</a>';
        }
    }

    forEach?
    Почему у тебя массив называется объектом?
    Что это за бесконечные конкатенации по всему коду разбросаны? Хотя бы темплейт строки для приличия использовал бы. И удобства.

    select.onchange = function () {  
        let sql = getSelectInfo();
        let a = getPagiInfo();
        let promiseResult = a.then(result => {b = result}).then(() => getObjects(sql, 7, b));   
    }

    У тебя что, лимит на более-менее адекватные названия для переменных закончился? Что за а? Что за б?

    function duol(aaa) {
        let sql = getSelectInfo();
    
        if (aaa != 1) {
            aaa = (aaa * 7) - 7; 
        } else {
            aaa = 0;
        }
    
        getObjects(sql, 7, aaa);
    
        if (aaa == 0) {
            aaa = 1;
        } else {
            aaa = (aaa / 7) + 1;
           
        }

    А это что за ааа? Даже не смешно.
    И что это за кривая имплементация остатка от деления? aaa = (aaa + 1) % 7;


    Прошёлся чисто по верхушкам, мне не хватило сил углубиться в это.
    Ответ написан
    4 комментария