• Как проксировать запросы к API?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    При использовании postman ничего проксировать не надо, он делает запросы без ограничений. Т.о. ошибки у вас возникают не по этой причине, а из-за кривых запросов и\или кривого сервера. Пытайтесь дальше.

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

    0xD34F
    @0xD34F Куратор тега JavaScript
    Строки сложить в массив. Завести два индекса - текущей строки и её последнего отображаемого символа. Если при увеличении количества отображаемых символов выходим за границу строки - переключаемся на следующую строку и сбрасываем счётчик символов.

    Куда, что и с какой задержкой будем печатать:

    const el = document.querySelector('p');
    const strings = [ 'hello, world!!', 'fuck the world', 'fuck everything' ];
    const delay = 100;

    Печатаем:

    function Typewriter(el, strings, delay) {
      let i = 0;
      let length = 0;
    
      return setInterval(() => {
        if (++length > strings[i].length) {
          i = -~i % strings.length;
          length = 0;
        }
    
        el.textContent = strings[i].slice(0, length);
      }, delay);
    }
    
    
    const intervalId = Typewriter(el, strings, delay);
    // хотим остановить, делаем так: clearInterval(intervalId);

    или

    function Typewriter(el, strings, delay) {
      let timeoutId = null;
    
      (function step(i, length) {
        length = -~length % -~strings[i].length;
        i = (i + !length) % strings.length;
        el.innerText = strings[i].substring(0, length);
        timeoutId = setTimeout(step, delay, i, length);
      })(0, 0);
    
      return () => clearTimeout(timeoutId);
    }
    
    
    const stop = Typewriter(el, strings, delay);
    // хотим остановить, делаем так: stop();
    Ответ написан
    1 комментарий
  • Как сделать cmd скрипт с меню?

    black1277
    @black1277
    Вольный стрелок
    1(важно) создаете текстовый файл и сохраняете его в формате UTF-8 (без BOM)
    2 открываете консоль win+R вводите cmd и жмете enter
    3 вводите команду powercfg /L - получите список всех схем питания и самое главное - их идентификаторы
    4 копируете код отсюда в текстовый файл и заменяете в строках с Powercfg -SETACTIVE айдишник на свои, полученные из предыдущего шага
    @echo off
    chcp 65001>nul
    
    call :ECHO " --= Выбор системы питания =--" 0B
    echo.
    call :ECHO " E - ЭНЕРГОСБЕРЕГАЮЩАЯ" 0E
    echo.
    call :ECHO " S - СБАЛАНСИРОВАННАЯ" 0A
    echo.
    call :ECHO " V - ВЫСОКОПРОИЗВОДИТЕЛЬНАЯ" 0D
    echo.
    call :ECHO " -----------------------------" 0B
    echo.
    
    call :ECHO " по умолчанию = " 0B
    call :ECHO " ВЫСОКОПРОИЗВОДИТЕЛЬНАЯ" 0C
    echo.
    call :ECHO " время для выбора " 0B
    call :ECHO "7сек" 0C
    echo.
    CHOICE /T 7 /C ESV /D v /M "Сделайте выбор"
    
    if %errorlevel% == 1 goto energo
    if %errorlevel% == 2 goto sbalans
    if %errorlevel% == 3 goto visoko
    
    :energo
    call :ECHO " -----------------------------" 0B
    echo.
    call :ECHO " выбрана" 0B
    call :ECHO " ЭНЕРГОСБЕРЕГАЮЩАЯ" 0E
    Powercfg -SETACTIVE a1841308-3541-4fab-bc81-f71556f20b4a
    goto saz
    
    :sbalans
    call :ECHO " -----------------------------" 0B
    echo.
    call :ECHO " выбрана" 0B
    call :ECHO " СБАЛАНСИРОВАННАЯ" 0A
    Powercfg -SETACTIVE 381b4222-f694-41f0-9685-ff5bb260df2e
    goto saz
    
    :visoko
    call :ECHO " -----------------------------" 0B
    echo.
    call :ECHO " выбрана" 0B
    call :ECHO " ВЫСОКОПРОИЗВОДИТЕЛЬНАЯ" 0D
    Powercfg -SETACTIVE 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
    
    :saz
    
    echo.
    echo " Завершение программы через 3 сек"
    >nul timeout/nobreak 3
    chcp 866>nul
    
    exit /b
     
    :ECHO
    chcp 866>nul
     
    for /f %%i in ('"prompt $h& for %%i in (.) do rem"') do (set Z=%%i)
    pushd "%TEMP%" && (
        <nul>"%~1^" set /p="%Z%%Z%  %Z%%Z%"
        findstr /a:%2 . "%~1^*"
        del "%~1^"
        popd
        )
    chcp 65001>nul
    exit /b

    В этой строке CHOICE /T 7 /C ESV /D v /M "Сделайте выбор" изменяйте на какие буквы будет реакция выбора 'ESV', а между /D и /M - какой выбор по умолчанию.
    Ответ написан
    2 комментария
  • Как массив объектов собрать в один объект, объединив одноимённые свойства в массивы?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Получаем все возможные ключи; под каждый создаём пустой массив; при обработке объекта из исходного массива бежим по массиву ключей, добавляем в соответствующий массив значение из объекта или дефолтное - в зависимости от наличия ключа в объекте:

    function groupValues(arr, defaultValue = null) {
      const keys = [...new Set(arr.flatMap(Object.keys))];
      return arr.reduce((acc, n) => {
        keys.forEach(k => acc[k].push(Object.hasOwn(n, k) ? n[k] : defaultValue));
        return acc;
      }, Object.fromEntries(keys.map(k => [ k, [] ])));
    }
    
    
    const result = groupValues(arr);

    Или, результирующий объект изначально пуст; при обработке объекта из исходного массива перебираем его ключи; если ключ отсутствует в результирующем объекте, создаём массив с длиной как у исходного, заполняем его дефолтным значением; записываем в массив в результирующем объекте значение под тем же индексом, который имеет обрабатываемый объект в исходном массиве:

    const groupValues = (arr, defaultValue = null) =>
      arr.reduce((acc, n, i, a) => (
        Object
          .keys(n)
          .forEach(k => (acc[k] ??= Array(a.length).fill(defaultValue))[i] = n[k]),
        acc
      ), {});
    Ответ написан
    Комментировать
  • Что делать, когда происходит дублирование или затроение события по срабатыванию триггера?

    oshliaer
    @oshliaer Куратор тега Google Apps Script
    Google Products Expert
    Используйте устанавливаемые триггеры и LockService https://developers.google.com/apps-script/referenc... для дозированного контроля запуска триггера. По ссылке есть простые примеры, каждый из них вам подойдет.
    Ответ написан
    1 комментарий
  • Как спарсить HTML таблицу в массив объектов?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно создать элемент template, вставить в него HTML строку, и забрать из него DocumentFragment.

    Там уже найти строки-ячейки как в обычном документе:
    const htmlString = `<table>
      <tr><td>Apple</td><td>12</td></tr>
      <tr><td>Banana</td><td>34</td></tr>
    </table>`;
    
    const tmpl = document.createElement('template');
    tmpl.innerHTML = htmlString;
    const df = tmpl.content;
    
    const rows = df.querySelectorAll('tr');
    const result = [];
    rows.forEach(row => {
      result.push([...row.children].map(td => td.textContent));
    });
    
    result // [["Apple","12"],["Banana","34"]]
    Ответ написан
    Комментировать
  • Как преобразовать древовидный массив в плоский?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Рекурсия есть:

    const flat = (arr, childrenKey) =>
      arr instanceof Array
        ? arr.flatMap(({ [childrenKey]: c, ...n }) => [ n, ...flat(c, childrenKey) ])
        : [];
    
    
    const result = flat(items, 'children');

    Рекурсии нет:

    function flat(arr, childrenKey) {
      const result = [];
    
      for (const stack = [...arr].reverse(); stack.length;) {
        const { [childrenKey]: c, ...n } = stack.pop();
    
        if (Array.isArray(c) && c.length) {
          stack.push(...[...c].reverse());
        }
    
        result.push(n);
      }
    
      return result;
    }
    
    // или
    
    function flat(arr, childrenKey) {
      const result = [];
      const stack = [];
    
      for (let i = 0; i < arr.length || stack.length; i++) {
        if (i === arr.length) {
          [ i, arr ] = stack.pop();
        } else {
          const { [childrenKey]: c, ...n } = arr[i];
    
          if (c?.constructor === Array && c.length) {
            stack.push([ i, arr ]);
            [ i, arr ] = [ -1, c ];
          }
    
          result.push(n);
        }
      }
    
      return result;
    }
    
    // или
    
    function flat([...arr], childrenKey) {
      for (const [ i, { [childrenKey]: c, ...n } ] of arr.entries()) {
        arr.splice(i, 1, n, ...(c?.[Symbol.iterator] && typeof c !== 'string' ? c : []));
      }
    
      return arr;
    }
    Ответ написан
    1 комментарий
  • Как на чистом JavaScript получить значение атрибута элемента по классу?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    document.addEventListener('click', event => {
      const { target } = event;
      if (target.tagName !== 'DIV'
          || !target.classList.contains('elem')) {
        return;
      }
      console.log(target.dataset.name);
    });


    Песочница
    Ответ написан
    7 комментариев
  • Как подсчитать количество повторов каждой метки?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Оригинальное решение от Евгений Драган в комментариях. Добавлено в пример. Updated 2022-06-10

    62a30eef98621931303335.png

    Прежний ответ про MMULT очень старый.

    Вот такой вариант более эффективный

    =ARRAYFORMULA(VLOOKUP(A:A;QUERY(A:A;"select A, count(A) group by A";0);2;0))


    Еще вариант от автора вопроса Евгений Драган

    =ARRAYFORMULA(COUNTIF(A2:A;A2:A))

    6296f5a688446503287148.png

    Пример в Таблице https://docs.google.com/spreadsheets/d/1mW9OS3WVQA...
    Ответ написан
    2 комментария
  • Почему при скачивании PDF файлов больших размеров они становятся битые?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Ты получаешь бинарник как текст в кодировке utf8, я правильно тебя понял?
    Ничего не кажется тебе в этом деле странным?)

    Полагаю файл бьётся на этапе преобразования - прочитать бинарник как utf8 - закодировать получившийся текст как из utf8 как бинарник.

    Что у тебя скрывается под api? Axios? Сделай так:
    api.get(`files/${id}`, {
      responseType: 'blob'
    }).then((r) => {
      const url = URL.createObjectURL(r.data);
      // ...
    Ответ написан
    5 комментариев
  • Как найти общие подстроки в нескольких строках на JavaScript?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Есть более простое (алгоритмически) решение.
    Общая суть его такова, вместо построения матрицы N1 x N2 делаем последовательный сдвиг меньшей строки относительно большей (1 цикл длинной N1+N2-2). На каждой итерации этого сдвига делаем второй цикл через текущую область пересечения этих строк, подсчитывая совпадения символов и запоминая их, если число совпадений больше предыдущего. Так же время выполнения такого алгоритма будет не O(Nmax*Nmin) а O(Nmax*Nmin -Nmin)

    Если не поленюсь, оформлю с утра в виде кода)

    PS: Заставляете не полениться:) Для поддержки поиска по строкам в количестве больше 2-х алгоритм был несколько модифицирован. Для удобства понимания почти не использовал "особые фишки" JavaScript-а, все выполнено на обычных циклах.
    код с комментариями

    function search_largest_substr(){
    	/*
    	Наибольшая общая строка не может 
    	быть больше наименьшей входной строки.
    	Находим наименьшую и по ходу формируем
    	массив с остальными:
    	*/
    
    		// в эту переменную внесем самую маленькую подстроку
    		let str_min = arguments[0];
    		// сюда сложим все остальные подстроки
    		const list = [];
    		
    		// пробежим в цикле по всем переданным в функцию аргументам
    		for(let n=1; n<arguments.length; n++){
    			// если строка в str_min меньше чем в
    			if(str_min.length<arguments[n].length){
    				// вносим в list текущую строку
    				list.push(arguments[n]);
    				// переходим к следующей итерации цикла
    				continue;
    			}
    
    			// иначе в list строку, лежащую в str_min
    			list.push(str_min);
    			// запоминаем в str_min текущую строку
    			str_min = arguments[n];
    		}
    
    	/*
    	Далее нам надо проверить наличие всех возможных
    	подстрок из самой маленькой строки в других строках.
    	Например если самая маленькая подствока была "abcd"
    	то надо последовательно проверить 
    	"abcd", "abc", "bcd", "ab", "bc", "cd", "a", "b", "c", "d"
    	Но при этом, как только будет найдена подстрока имеющаяся
    	во всех строках надо сразу завершить цикл с проверкой.
    	*/
    		// Данный цикл будет определять текущий размер 
    		// проверяемой подстроки, начиная от наибольшего возможного.
    		// Например для строки "abcd" это будут значения 4, 3, 2, 1
    		for(let l=str_min.length; l>0; l--){
    
    			// В данном цикле определяем позицию подстроки.
    			// Например для строки "abcd" это будут значения:
    			// при l=4 будут 0
    			// при l=3 будут 0, 1
    			// при l=2 будут 0, 1, 2
    			// при l=1 будут 0, 1, 2, 3
    			for(let p=0; p<=str_min.length-l; p++){
    				// берем из наименьшей строки тестируемую подстроку
    				const substr = str_min.slice(p, p+l);
    
    				// если искомый фрагмент есть во всех строках
    				// то isFound будет присвоено true
    				let isFound = true;
    
    				// далее в цикле проверяем все остальные строки 
    				// на наличие искомой подстроки
    				for(let i=0; i<list.length; i++){
    					// если искомая подстрока присутствует в
    					// текущей строке - ничего не делаем
    					if(	list[i].indexOf(substr) >= 0)
    						continue;
    
    					// иначе выставляем isFound=false 
    					// и прерываем текущий цикл по i
    					isFound=false;
    					break;
    				}
    
    				// если isFound == true значит нужная подстрока найдена
    				if( isFound )
    					return substr;
    
    				// иначе продолжаем поиск
    			}
    		}
    
    		// если не было найдено ни единой соврадающей подстроки
    		// возвращаем пустую строку
    		return "";
    }
    
    
    // Исползуем функцию поиска так:
    var str = search_largest_substr("ABCDEFGH", "ABCDEFG", "ABCDEF");
    console.log(str);
    
    
    str = search_largest_substr("123445", "12654", "123768");
    console.log(str);


    Ответ написан
  • Как найти второе по величине значение в массиве?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const max = Math.max(...array);
    const second = array.reduce((acc, c) => c === max ? acc : Math.max(acc, c));
    Ответ написан
    Комментировать
  • Как посчитать сколько встречается каждое слово в таблице (или ячейке)?

    ProgrammerForever
    @ProgrammerForever Куратор тега Google Apps Script
    Учитель, автоэлектрик, программист, музыкант
    Виктор Л всё правильно подсказал.
    Если немного изменить его код, можно получить не по одной ячейке, а по диапазону.
    function COUNTUNIQWORDS(range) {
     let wordsCount = {};
     range.forEach(row=>{
       row.forEach(cell=>{
         let text = String(cell)
                      .toLowerCase()
                      .replace(/[^а-яА-ЯёЁa-zA-Z ]+/gi, ' ')
                      .replace(/\s+/gi, ' ');
        let words = text
                      .split(' ')
                      .filter(word=>word!=='');
        words.forEach(word=>{
          if (wordsCount[word]){
            wordsCount[word]+=1;
          }else{
            wordsCount[word]=1;
          };
        });
       });
     });
     
      let result = Object.keys(wordsCount)
                    .sort()
                    .map(word=>[word, wordsCount[word]]);
      return result;
    };


    Демонстрационная таблица с кодом
    Ответ написан
    5 комментариев
  • Как сделать ссылку на ячейку в виде скрипта?

    oshliaer
    @oshliaer Куратор тега Google Sheets
    Google Products Expert
    Добавьте следующий код для проекта вашей Таблицы

    const goToWrapper_ = (address) => {
      const range = getRangeByRefString_(SpreadsheetApp.getActiveSheet(), address);
      range.getSheet().getRange('A1').activate();
      range.activate();
    }
    
    function getRangeByRefString_(sheet, refString) {
      return refString.indexOf('!') === -1 ?
        sheet.getRange(refString) :
        sheet.getParent().getRange(refString);
    }
    
    function goTo555() {
      goToWrapper_('A555');
    }
    
    function goToSheet5A555() {
      goToWrapper_('Sheet5!A555');
    }


    Назначьте скрипт кнопке

    6100fb73c48a3821432145.png

    Пример в Таблице https://docs.google.com/spreadsheets/d/1XO63gawVjR...

    Можно создать быстрое меню (не кнопку) практически любого адреса. Но там придется вызывать меню. А это на целый клик больше!
    Ответ написан
    4 комментария
  • Как работает веб-сервер и node js в связке? Зачем нужен Nginx?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега Веб-разработка
    Самое простое - nginx отдаёт статику. На больших объёмах делать это через Ноду неэффективно.
    Посложнее - nginx позволяет управлять ходом запроса. Например, редиректить на https.
    Ещё сложнее - можно настроить nginx, чтобы он умно балансировал запросы между несколькими бэкендами и автоматом блокировал слишком частые попытки подключения.

    Nginx очень хорошо в промышленных масштабах делает определённую часть работы, связанной с http-запросом, поэтому ему эту часть работы и делегируют.
    Ответ написан
    Комментировать
  • Связь Javascript с интернетом?

    DevMan
    @DevMan
    всё придумано за вас: distill.io и аналоги.
    Ответ написан
    Комментировать
  • Как получить количество строк и внести их в колонку слева пронумеровав их?

    Stalker_RED
    @Stalker_RED
    const rowsCount = content.split('\n').length;
    Осталось в цикле вывести номера строк.
    rowNumbers.innerHTML = Array(rowsCount).fill(0).map((_,i)=>`<span>${i+1}</span>`).join('<br>');
    Ответ написан
    5 комментариев
  • Как оставить в объекте три самых больших числа?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Сколько свойств должно быть в объекте: const propsCount = 3;.

    Собираем новый объект:

    const newObj = Object.fromEntries(Object
      .entries(obj)
      .sort((a, b) => a[1] - b[1])
      .slice(-propsCount)
    );

    Удаляем свойства существующего:

    Object
      .entries(obj)
      .sort((a, b) => b[1] - a[1])
      .slice(propsCount)
      .forEach(n => delete obj[n[0]]);
    Ответ написан
    3 комментария