• Как эффективно и лаконично отсортировать файл из строк не вмещающихся в память?

    Adamos
    @Adamos
    А зачем вам вся строка для сортировки?
    Вам она нужна только до того байта, который не совпадет с другими строками.
    Взять от каждой строки по 64Kб, отранжировать по отличиям в этой части, продолжить читать только у тех, у которых она совпадает. Повторять чтение кусков до прекращения совпадений.
    Ответ написан
    5 комментариев
  • Как сделать чтобы при нажатии на кнопку открывался только один элемент, а не все?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Сразу определим селекторы элементов и класс, они нам дальше понадобятся:

    const blockSelector = 'селектор блоков';
    const buttonSelector = 'селектор кнопок';
    const activeClass = 'класс, показывающий блок';

    Класс надо переключать не у всех блоков сразу, а у того, который соответствует нажатой кнопке. Как определить, какой блок нужен? Можно просто по индексу. Нажали третью кнопку - нужен третий блок. Как узнать индекс кнопки? Например, он передаётся в коллбек метода forEach. Т.е., в список параметров внешнего forEach добавляем индекс, и вместо внутреннего forEach выполняем обращение к соответствующему элементу коллекции блоков:

    const blocks = document.querySelectorAll(blockSelector);
    const buttons = document.querySelectorAll(buttonSelector);
    
    buttons.forEach((n, i) => {
      n.addEventListener('click', () => {
        blocks[i].classList.toggle(activeClass);
      });
    });

    Кстати, создавать отдельные обработчики клика для каждой из кнопок не обязательно, можно сделать один общий. Как при этом получать индексы? - их можно прицепить прямо к кнопкам. Например, в виде data-атрибута:

    const onClick = function({ currentTarget: { dataset: { index } } }) {
      this[index].classList.toggle(activeClass);
    }.bind(document.querySelectorAll(blockSelector));
    
    document.querySelectorAll(buttonSelector).forEach((n, i) => {
      n.dataset.index = i;
      n.addEventListener('click', onClick);
    });

    Также есть вариант вычислять индекс при клике:

    const blocks = document.querySelectorAll(blockSelector);
    const buttons = document.querySelectorAll(buttonSelector);
    
    buttons.forEach(n => n.addEventListener('click', onClick));
    
    function onClick() {
      const index = Array.prototype.indexOf.call(buttons, this);
      blocks[index].classList.toggle(activeClass);
    }

    А вообще, если у каждой из пар кнопка-блок есть отдельный общий предок (const containerSelector = '...';), то индексы не нужны. Достаточно от нажатой кнопки подняться до общего предка кнопки и блока, и найти внутри блок (а можно даже и не искать, если добавлять класс контейнеру; конечно, стили придётся в этом случае немного изменить, вместо .блок.класс будет .контейнер.класс .блок):

    const toggleBlock = button => button
      ?.closest(containerSelector)
      ?.querySelector(blockSelector)
      .classList
      .toggle(activeClass);
    
    
    // можно добавить обработчик клика каждой кнопке индивидуально
    document.querySelectorAll(buttonSelector).forEach(function(n) {
      n.addEventListener('click', this);
    }, e => toggleBlock(e.currentTarget));
    
    // или один раз на всю страницу
    document.addEventListener('click', e => {
      toggleBlock(e.target.closest(buttonSelector));
    });
    Ответ написан
    Комментировать
  • Как защитить сайт от копии-подделки с рекламой?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    У поисковых систем есть формы жалоб, в том числе на такое.
    Ответ написан
    Комментировать
  • Как защитить сайт от копии-подделки с рекламой?

    я бы написал в google, была похожая ситуация, они оперативно выкинули подделку из органического поиска, думаю и забанить в рекламе тоже могут, если он там рекламируется.
    Ответ написан
    2 комментария
  • Как устроены хэштаблицы?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Сначала выделяется массив какого-то размера, например 256. Обычно длина - степень двойки. Потом хеш обрезается до размера таблицы. Если элементов становится слишком много, то происходит перехеширование - размер таблицы увеличивается, и все элементы в нее перезапихиваются.

    Но да, если в таблицу запихать много элементов, а потом почти все оттуда удалить, то она будет большая и почти вся пустая.

    Edit:

    Эта "проблема" никак не решается. Это и не проблема вовсе. Просто хеш-таблицы работают быстрее всяких балансированных деревьев или тупо сортированного массива за счет большего расхода памяти. Это нужно знать и дальше уже решать - что вам больше подходит под вашу конкретную задачу.
    Ответ написан
    Комментировать
  • Как заменить часть строки данными из массива (php)?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    8 комментариев
  • Как сложить значения объектов массива в новый массив?

    @historydev Куратор тега JavaScript
    Острая аллергия на анимешников
    items.map(el => el.id);
    Ответ написан
    6 комментариев
  • Почему при обращении по ключу объекта, который сам (ключ) является объектом, всегда возвращается значение последнего ключа?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Ключи объектов - это строки, если использовать нестроковое значение в качестве ключа, оно будет преобразовано в строку, дефолтное строковое представление объекта - это "[object Object]". Всё.

    Хотите, чтобы объект реально был ключом - записывайте его в Map вместо простого объекта. Или научите свои объекты представлять себя в виде строки, переопределив у них метод toString (конечно, поступать так имеет смысл только в том случае, если вы можете гарантировать, что строковые представления будут уникальны).
    Ответ написан
    5 комментариев
  • Как правильно закрывать от индексаций страницы для yandex?

    pro100taa
    @pro100taa
    Проходит уже 3й день


    Подождите. Рано еще. Куда так торопитесь. Яндекс может robots.txt месяц обрабатывать. Можете ускорить если по префиксу удалите страницы в ЯВебмастере.
    Ответ написан
    2 комментария
  • Как заменить каждый из символов подстроки на звездочку?

    0xD34F
    @0xD34F Куратор тега JavaScript
    out.innerText = badWords.reduce((str, n) => str.replaceAll(n, '*'.repeat(n.length)), field);
    Ответ написан
    Комментировать
  • Почему переменная не копирует ссылку на объект?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    = - это присваивание, а не изменение. В случае с объектом присваивание ссылки, но всё ещё присваивание.
    Ответ написан
    Комментировать
  • Как модифицировать прелоадер на jQuery?

    @zkrvndm
    Софт для автоматизации
    Произвольное количество файлов:
    $(function() {
    	
    	$('#fileupload').change(function(event) {
    		
    		var html_code = '';
    		
    		for (var n = 0; n < event.target.files.length; n++) {
    			
    			html_code += '<img src="'+URL.createObjectURL(event.target.files[n])+'" id="upload-img-'+Number(n+1)+'">';
    			
    		}
    		
    		$('.profile-images').html(html_code);
    		
    		console.log('Выбраны файлы:', event.target.files);
    		
    	});
    	
    });
    Ответ написан
    Комментировать
  • Как ускорить алгоритм скользящего среднего?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    const movingAverage = (data, windowSize) => {
      let sum = data.slice(0, windowSize).reduce((acc, cur) => acc + cur, 0);
      const result = [sum / windowSize];
      for (let i = windowSize; i < data.length; i += 1) {
        sum = sum - data[i - windowSize] + data[i];
        result.push(sum / windowSize);
      }
      return result;
    };
    console.log(movingAverage([9, 3, 2, 0, 1, 5, 1, 0, 0], 3));
    // Array(7) [ 4.666666666666667, 1.6666666666666667, 1, 2, 2.3333333333333335, 2, 0.3333333333333333 ]
    Ответ написан
    2 комментария
  • Как получить ответы на запросы сторонних скриптов в js?

    @zkrvndm
    Софт для автоматизации
    Делать браузерное расширение не обязательно, вы можете запускать свой код сразу в консоли Ctrl + Shift + J и это не потребует установки никаких расширений. Либо вы можете использовать готовое расширение, например:
    https://chrome.google.com/webstore/detail/custom-j...

    Кроме расширений, таких как выше, также можно использовать блокировщики рекламы. Казалось бы причем тут блокировщики рекламы? Ну просто это их базовый функционал, многие блокировщики рекламы из под коробки позволяют на сторонних сайтах запускать свой код, это называется UserScript или пользовательские скрипты:
    https://kb.adguard.com/ru/general/userscripts

    Насчет того, как именно перехватывать запросы на чужом сайте... для этого на самом деле достаточно заменить метод window.XMLHttpRequest своей собственной функцией, это фактически позволит перехватывать все запросы выполненные посредством XMLHttpRequest, аналогично дела обстоят и c fetch.

    Замена родных нативных методов браузера своими собственными называется манкипатчем:
    https://yandex.ru/search/?text=XMLHttpRequest+fetc...

    Пример простейшего манкипатча:
    var original = {
    	open: XMLHttpRequest.prototype.open,
    	send: XMLHttpRequest.prototype.send
    };
    
    XMLHttpRequest.prototype.open = function (method, url, async, user, password) {
    	console.log('Инициируется запрос:', method, url);
    	return original.open.call(this, method, url, async, user, password);
    };
    
    XMLHttpRequest.prototype.send = function (data) {
    	console.log('Отправляются данные:', data);
    	return original.send.call(this, data);
    };
    Ответ написан
    6 комментариев
  • Как изменить чужую HTML страницу через консоль, чтобы изменения сохранялись?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    Есть плагины для браузеров, меняющие код страницы на лету. Изменения применяются при каждой загрузке.
    Ответ написан
    Комментировать
  • Как изменить чужую HTML страницу через консоль, чтобы изменения сохранялись?

    Написать плагин для хрома, Фокса и делать что на странице по типу templemonkey
    Ответ написан
    Комментировать
  • Как пишут обмен данными (сетевой движок) для компьютерных игр?

    twobomb
    @twobomb
    Какие известны хитрости, чтобы передавать меньше данных, не рискуя рассинхроном?

    Чем меньше тик рейт сервера, тем меньше данных. Одно дело динамичный шутер(батла на 130 человек), а другое дело кооп игра на 4 человек. В одних случая критичен высокий тик рейт в других нет. Хотя... умереть в батле через секунду после того как ты забежал за стену благое дело...
    Какие рассинхроны не критичны?

    Опять зависит от игры.
    В каком порядке происходит проигрывание на сервере того, что на клиенте было сделано, и как клиенты-друзья воспроизводят действия?

    Ну почитайте какие нибудь статьи вот например на хабре
    Мультиплеер в быстрых играх (части I, II)
    Мультиплеер в быстрых играх (Часть III: появление ...
    Мультиплеер в быстрых играх (Часть IV: Хэдшот! Пут...

    В двух словах определитесь с направленностью игры, тик рейтом, частопердаваемые данные передавайте по протоколу UDP, используйте интерполяцию для движений.
    Ответ написан
    1 комментарий
  • Как сформировать файл из текста полученного от бэка?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Примерно так:
    const text = 'Текст для сохранения';
    const blob = new Blob([text], { type: 'text/plain' });
    const content = URL.createObjectURL(blob);
    const link = document.createElement('a');
    link.href = content;
    link.download = 'test.txt';
    document.body.appendChild(link);
    const click = new Event('click');
    link.dispatchEvent(click);
    link.remove();
    Ответ написан
    Комментировать
  • Как разбить textarea на массив?

    mizutsune
    @mizutsune
    Frontend Developer
    1. Получаем содержимое textarea.
    2. Используя метод split разбиваем полученное значение на отдельные слова или предложения по разделителю (перенос строки/точка с запятой/запятая/точка/пробел/etc).
    4. Profit.

    Окончательный результат зависит от того => массив каких значений вам нужно получить и в связи с этим, нужно составлять определенные функции, которые будут решать поставленные задачи, при этом нужно учитывать достаточно множество моментов, при которых что-то может пойти не так.

    Несколько примеров

    Пример - №1:

    Задача: Получить простой массив слов, без модификации регистра заглавных букв и без удаления специальных символов, ну и всего остального.

    let value = '   Illusion is the first of all pleasures.   ';
    
    value.split(" ").filter(n => n !== "");


    1. На первом этапе разбиваем строку на массив слов, используя в качестве разделителя пробел.
    2. На втором этапе удаляются пустые значения из массива.

    Результат:

    ['Illusion', 'is', 'the', 'first', 'of', 'all', 'pleasures.']


    Пример - №2:

    Задача: Получить массив слов без специальных символов и прочего.

    let value = `       Lorem ipsum dolor sit amet, consectetur adipiscing elit, 
    sed do eiusmod, tempor et dolore magna aliqua.
    Amet facilisis magna!!! 
    Ornare quam viverra volutpat odio facilisis mauris.    `;
    
    value.split(" ").map(n => n.replace(/[\r\n.,!]/g, '')).filter(n => n !== "");


    1. На первом этапе разбиваем строку на массив слов, используя в качестве разделителя пробел.
    2. На втором этапе удаляем из каждого "слова" точки, запятые и восклицательный знак.

    Результат:

    ["Lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing",
    "elit", "sed", "do", "eiusmod", "tempor", "et", "dolore",
    "magna", "aliquaAmet", "facilisis", "magna", "Ornare", "quam",
    "viverra", "volutpat", "odio", "facilisis", "mauris"]


    Пример - №3:

    Задача: Получить массив предложений из текста.

    let value = " Lorem ipsum. Dolor sit amet. Consectetur adipiscing elit.      ";
    
    value.split(".").map(n => n.trim()).filter(n => n!== "").map(n => `${n}.`):


    1. На первом этапе разбиваем строку на массив слов, используя в качестве разделителя символ точки, так как точка символизирует окончание предложения в тексте. По крайней мере, в большинстве случаев.
    2. На втором этапе обрезаем пробелы вначале и в конце каждого элемента массива.
    3. На третьем этапе избавляемся от пустых значений.
    4. На четвёртом этапе расставляем точки на концах строк, чтобы превратить их в предложения.

    Результат:

    ['Lorem ipsum.', 'Dolor sit amet.', 'Consectetur adipiscing elit.']


    Пример - №4:

    Задача: Разделить строку на части и записать их в массив, используя несколько разных разделителей.

    let value = "Lorem ipsum, tempor magna aliqua. Dolor sit amet? Consectetur! Adipiscing elit.";
    
    value.split(/[,.?!]/).map(n => n.trim()).filter(n => n!== "");


    1. На первом этапе разбиваем строку на массив слов, используя в качестве разделителя группу символов.
    2. На втором этапе обрезаем пробелы вначале и в конце каждого элемента массива.
    3. На третьем этапе избавляемся от пустых значений.

    Результат:

    ['Lorem ipsum', 'tempor et dolore magna aliqua', 'Dolor sit amet', 'Consectetur', 'Adipiscing elit']




    Вариантов разделения строки на массив может быть огромное множество.
    Ответ написан
    Комментировать
  • Как ускорить fetch в цикле?

    vabka
    @vabka
    Токсичный шарпист
    мне нужно достать первую которая ответила статусом 200

    Например, ты можешь вместо Promise.all использовать Promise.any
    https://developer.mozilla.org/ru/docs/Web/JavaScri...
    Или Promise.race
    https://developer.mozilla.org/ru/docs/Web/JavaScri...
    Ответ написан
    1 комментарий