• 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);

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

    WblCHA
    @WblCHA
    Не очень понял, но, наверно, ты про это:
    https://marketplace.visualstudio.com/items?itemNam...
    Ответ написан
    Комментировать
  • Можете оценить тестовый проект на ReactJS + Redux?

    WblCHA
    @WblCHA
    1. Нет ни еслинта, ни преттиера.
    2. Нет тестов.
    3. Все коммиты без названий.
    4. Почти все комментарии на русском. Да и большая часть описывает банальные вещи.
    state[0] = state[index] // запись нового выбора на первое место
    state.splice(index, 1) // удаление нового выбора с предыдущей позиции в массиве

    5. Использование комментариев для функций вместо жсдока.
    6. Мне лень разбираться, но sort тут не подходит разве?
    spoiler
    for (let i = 1; i < state.length; i++) { // сортировка от меньшего к большему по первому числу для возврата предыдущего выбора на правильную позицию
                        if (state[i].split(' ')[0] > beforeSelected.split(' ')[0]) {
                            state.splice(i, 0, beforeSelected) // запись предыдущего выбора на правильную позицию
                            break
                        } else if (state[i].split(' ')[0] === beforeSelected.split(' ')[0]) { // если первые числа равны проверка по второму числу
                            if (state[i].split(' ')[2] >= beforeSelected.split(' ')[2]) {
                                state.splice(i, 0, beforeSelected) // запись предыдущего выбора на правильную позицию
                                break
                            }
                        }
                        if (i === state.length - 1) { // если предыдущий выбор оказалася наибольшим
                            state.push(beforeSelected)
                            break
                        }
                    }

    7. Не используй деструктуризацию в аргументе функции, если используешь параметр лишь раз.
    spoiler
    const resize = ({ param }) => { // изменение select
        ...
      }

    Это равносильно:
    const resize = (obj) => { // изменение select
        const param = obj.param;
        ...
      }


    8. Все тексты захардкожены прямо в коде.
    9. Питон-стайл (где точки с запятой?).
    10. Почему в папка types лежат компоненты, а не типы? Это, конечно, жс, а не тс, но сути это не меняет.

    Короче, это так, беглый осмотр.
    Ответ написан
    6 комментариев
  • Как повесить на обработчик события больше одной функции?

    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 комментария
  • Как в TypeScript описать массив массивов с объектами внутри?

    WblCHA
    @WblCHA
    {
      var1: string;
      var2: string;
      // or
      [key: string]: string;
    }[][]
    Ответ написан
    Комментировать
  • Какие есть дополнения для показа результата в Visual Studio Code?

    WblCHA
    @WblCHA
    А зачем? Берёшь, запускаешь лайв сервер, окно вскода перетягиваешь в левую часть экрана, а окно браузера в правую (а лучше просто на второй экран) и всё.
    Ответ написан
    Комментировать
  • Как оптимально и красиво решить данную задачу?

    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];
    })()
    Ответ написан
    Комментировать