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

    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 комментария
  • Как оптимально и красиво решить данную задачу?

    WblCHA
    @WblCHA
    Можно каждый раз не считать с нуля факториал.
    const sumFactorials = (maxN) => {
      let factorial = 1;
      const getNextFactorial = (n) => {
        factorial *= n;
        return factorial;
      }
    
      const adder = (sum, n) => 
      	n < maxN ? 
      	1 / getNextFactorial(n) + adder(sum, n + 1) : 
      	sum + 1 / getNextFactorial(n);
    
      return adder(0, 1);
    }
    
    return sumFactorials(3);
    Ответ написан
  • Как определить имеет масив значение?

    WblCHA
    @WblCHA
    Зачем сплитить?
    const result = number.some((n) => something.includes(n));
    Ответ написан
    Комментировать
  • Как перебрать массив?

    WblCHA
    @WblCHA
    Имхо, фильтр с мапом тут использовать незачем. Задачка прямо для редьюса.
    const getTitlesById = (arr, id) => {
      const idString = id.toString();
    
      return arr.reduce((acc, el) => {
        if(el.id === idString) {
          acc.push(el.title);
        }
        return acc;
      }, []);
    }
    Ответ написан
    Комментировать
  • Как перебрать массив с помощью includes?

    WblCHA
    @WblCHA
    arr.flat().includes(3)
    Но вообще в данном случае правильнее будет использовать сом:
    arr.some((a) => a.includes(3))
    Ответ написан
    Комментировать
  • Написать function expression суммы чисел геометрической прогрессии?

    WblCHA
    @WblCHA
    Вообще, вот:
    const sumG = (n, g) => {
        let sum = 0;
        let lastNum = 1;
        let str = '';
        
        for (let i = 0; i < n; i++) {
          sum += lastNum;
          str += `${lastNum} `;
          lastNum *= g;
        }
        str = str.slice(0, -1);
        
        console.log(str);
        return sum;
      };
      console.log(sumG(5,2));


    НО в твоём коде есть проблемы, из-за которых он и работать не сможет.
    Иф с большой буквы:
    If(b1 > 1) {

    Разные названия функций:
    let sumG = 
    SumG(5,2)

    А так же просто кривой код.
    Сумма должна быть числом или строкой?
    let sum = "";

    Это вообще, не рыба не мясо. Либо стрелочная должна быть, либо фанкшаном объявлять.
    let sumG = function (n,g) {
    Ответ написан
    9 комментариев
  • Как проверить изменения внешнего объекта в JEST?

    WblCHA
    @WblCHA
    const obj = { a: 1 };
    const expectedObj = { a: 2 };
    
    someFunction(obj);
    
    expect(obj).toEqual(expectedObj);

    ----------------------
    someFunction(JSON.parse(JSON.stringify(obj)))
    Ответ написан
  • Как исправить ошибку в переборе массива?

    WblCHA
    @WblCHA
    Да уж, в этом коде DRY расчленили самыми жестокими методами...

    Собственно, место проблемы:
    for (let el = 0; el < moscowCity.length; el++) {
    		if (secondCity === moscowCity[el].city) {
    			secondMoscowOrNot = "moscow-city"
    		} else if (secondCity != moscowCity[el].city) {
    			secondMoscowOrNot = "not-moscow-city"
    		}
    	}
    
    	for (let le = 0; le < moscowCity.length; le++) {
    		if (firstCity === moscowCity[le].city) {
    			firstMoscowOrNot = "moscow-city"
    		} else if (firstCity != moscowCity[le].city) {
    			firstMoscowOrNot = "not-moscow-city"
    		}
    	}

    Во-первых, ужасные значения firstMoscowOrNot и secondMoscowOrNot, как и названия. Должно быть isFirstMoscowCity и isSecondMoscowCity (по факту и они в таком виде так себе, но всё же) с типом булин, естественно, а не "not-moscow-city".
    Во-вторых, эта конструкция в целом нафиг не нужна.
    И в-третьих, что и ломало всё, какие условия выхода из цикла? Цикл проходит полностью, даже если нашёл совпадение, и в итоге перезаписывает значение.

    Короче говоря, должно быть так:
    const isFirstMoscowCity = moscowCity.some((c) => firstCity === c.city);
    const isSecondMoscowCity = moscowCity.some((c) => secondCity === c.city);
    Ответ написан
    Комментировать
  • Как зациклить setInterval?

    WblCHA
    @WblCHA
    const texts = ['text1', 'text2', 'text3', 'text4'];
    	const div = document.querySelector('#slider');
      
      const timer = () => {
        const maxIndex = texts.length;
        let i = 0;
        
        setInterval(() => {
          div.innerHTML = texts[i];
          i = (i + 1) % maxIndex;
        }, 500);
      }
      
      timer();
    Ответ написан
    Комментировать
  • Почему не работает решение задачи?

    WblCHA
    @WblCHA
    Интересный алгоритм, но реализация хромает.
    const arr = [1, 2, 23, 23, 23, 0, 4, 2, 11, 4, 3, 3, 3, 3, 23, 23]

    Вот кейс, который ломает работу алгоритма. Если максимальное число в массиве имеет больше всего повторений, а ранее в массиве встречалось число с на 1 меньшим количеством повторений, то усё.
    Причина в этом:
    while(i < arrSort.length-1)
    Почему ты решила, что выходить из цикла на предпоследнем элементе хорошая идея, мне решительно непонятно.

    Помимо этого есть ещё ряд проблем, которые влияют лишь на качество кода:

    let arrSort = arr.sort((a,b)=> a < b ? -1 : 1)

    Во-первых, сорт работает на месте. Во-вторых, что это за извращение в калбеке?
    arr.sort((a, b) => a - b)

    let numberNext = 1;
    let i = 0;

    С чего вдруг первое равно единице, а второе нулю? При первой же паре значений numberNext окажется меньше i, он банально не на каждой итерации увеличивает своё значение, в отличии от i.

    while(i < arrSort.length)

    По какой причине тут используется вайл, когда тут всё для фора заточено?
    ;
        let numberNext = 0;
        let number = arr[0];
    
        for(let i = 1; i < arr.length; i++) {
          if(arr[i] === arr[numberNext]) {
            number = arr[numberNext];
            continue;
          }
          numberNext++;
        }


    numberNext+=1
    i++

    Ты уже определись какой вариант ты будешь использовать.

    И последнее, аллергия на ;?)
    Ответ написан
    3 комментария
  • Как посчитать в строке и соединить текст использую данные из объекта?

    WblCHA
    @WblCHA
    (() => {
      const fields = [
        {
          name: 'Car',
          options: {
            min: 'Audi',
            max: 'Big Toyota',
          }
        },
        {
          name: 'name',
          options: {
            min: 'Иван',
            max: 'Алексей Иванович',
          }
        }
      ];
      const origStr = 'Привет, меня зовут {{name}}! У меня есть машина {{car}}';
      
      const replaceKeysToText = (str, optionsKey) =>
        str.replace(/\{\{\s*(\w+)\s*\}\}/g, (fullMatch, key) => {
          const field = fields.find((f) => f.name.toLowerCase() === key);
          if(!field) {
            return fullMatch;
          }
          return field.options[optionsKey];
        });
      
      const short = replaceKeysToText(origStr, 'min');
      const long = replaceKeysToText(origStr, 'max');
      
      return [short, long];
    })()
    Ответ написан
    Комментировать
  • Как один элемент объекта засунуть в массив?

    WblCHA
    @WblCHA
    Как вытащить все значения born и died, в два разных массива

    А зачем?
    const getAverageAge = (humans) => humans.reduce((acc, h) => acc + (h.died - h.born), 0) / humans.length;
    Ответ написан
    Комментировать
  • Чем асинхронность отличается от однопоточности в Javascript?

    WblCHA
    @WblCHA
    Асинхронность в первую очередь нужна, когда идут запросы на сервер.
    Тут, имхо, будет хороша такая аналогия:
    Начальник ─ программист.
    Грузчик 1шт. ─ интерепритатор жс.
    Начальник ставит грузчику 2 задачи: разгрузить фуры и перетащить коробки партиями из А в Б.
    На разгрузку одной фуры грузчику надо 15 минут, фуры приходят 1 раз в час, фур 5 штук, 1ая уже готова к разгрузке.
    Перетащить одну партию коробок требует 5 минут, новая партия поступает сразу после доставки предыдущей, всего 50 партий.
    Синхронный ─ это когда грузчик разгружает фуру каждый час, попивая чаёк с печеньками в ожидании следующей фуры, и только после того, как разгрузит все фуры, начнёт таскать коробки. На всё про всё уйдёт более 8 часов.
    Асинхронный ─ это когда грузчик работает без продуху, только разгрузил фуру, сразу начал таскать коробки, приехала фура, начал разгружать её, и т.д. На всё про всё уйдёт чуть более 5 часов.

    Надеюсь, логика ясна.
    Ответ написан
  • Как правильно настроить if и while?

    WblCHA
    @WblCHA
    Я бы поменьше элсов использовал для лучшей читабельности.
    button.onclick = function () {
      if (nameEntered) {
        if (+input.value === randomNumber) {
          text.textContent = "Вы победили!";
          button.hidden = true;
          return;
        } 
    
        text.textContent = 
          +input.value > randomNumber ?
          "Неправильно! Моё число меньше!" :
        	"Неправильно! Моё число больше!";
        return;
      }
    
      if (!input.value.trim()) {
        text.textContent = "Вы не ввели имя!";
        return;
      } 
    
      nameEntered = true;
      nameText.textContent = `Здравствуйте, ${input.value}!`;
      text.textContent = "Теперь введите число!";
    }
    Ответ написан
    Комментировать
  • Почему массив не заполняется до конца?

    WblCHA
    @WblCHA
    Что это за велосипед?
    const params = taskIds.map((taskId) => ({
      method: 'tasks.task.get',
      params: {
        taskId,
        select: ['ID', 'TITLE', 'UF_CRM_TASK']
      }
    }))
    Ответ написан
  • Как получить массив чисел месяца вместе с днями недели?

    WblCHA
    @WblCHA
    Ума не приложу каким боком в таком виде это может понадобиться.
    dayOfTheMonth.forEach((date) => {
      const day = daysOfTheWeek[(date - 1) % 7];
      console.log(`${date} января, ${day}`);
    });


    П.с.: ожидаем следующий вопрос "Как узнать первый день недели месяца?".
    Ответ написан
    3 комментария
  • Как заменить любое количество -, на одно -?

    WblCHA
    @WblCHA
    str.replace(/-{2,}/, '-');
    Упрлс
    str.replace(/-+/, '-');
    Ответ написан
    Комментировать
  • Регулярное выражение для этого списка электронных адресов?

    WblCHA
    @WblCHA
    Учитывая разнообразие эмайлов, можешь просто юзать это: /^.+@.+$/
    Ответ написан
    3 комментария
  • JS Promise Memoize как правильно описать функцию?

    WblCHA
    @WblCHA
    Немного не туда написали, вам сюда: freelance.habr.com
    Ответ написан
    Комментировать