Ответы пользователя по тегу JavaScript
  • Как выбрать архитектуру автономного веб-приложения?

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

    Например, если это приложение для ресторана, то логично предположить, что в какой-то момент у юзера может не быть связи или кончились деньги на телефоне. И если до этого удалось успеть загрузить номер заказа через WiFi, которого уже нет, то с этой информацией всё равно можно работать. Как именно - вопрос уже скорее дизайна, чем архитектуры. В противовес этому можно не заморачиваться и показывать заглушку о недоступности Интернета, но это будет бесить некоторых клиентов.

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

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Браузерным расширением - никак. Это область, где расширения не должны иметь власти.

    Решение может быть только вне браузера - приложением для ОС.
    Если чисто для себя, то можно быстро написать за 15 минут на коленке.
    Ответ написан
    Комментировать
  • Как правильно/красивее написать код js?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Самый оптимальный подход в большинстве случаев - использовать addEventListener() и делегирование событий. Это более гибкий и масштабируемый способ, который позволяет обрабатывать события более эффективно и поддерживает хорошую структуру кода.
    Ответ написан
  • Как найти определенную последовательность в массиве объектов?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Попробуй это:
    код
    function findSequence(arr) {
        let maxSequence = [];
        let currentSequence = [];
    
        for (let i = 1; i < arr.length - 1; i++) {
            const currentValue = parseInt(arr[i].value, 10);
            const prevValue = parseInt(arr[i - 1].value, 10);
            const nextValue = parseInt(arr[i + 1].value, 10);
    
            if (prevValue > currentValue && currentValue < nextValue) {
                currentSequence = [arr[i]];
            } else if (currentSequence.length > 0 && currentValue < nextValue) {
                currentSequence.push(arr[i]);
            } else {
                currentSequence = [];
            }
    
            if (currentSequence.length > maxSequence.length) {
                maxSequence = currentSequence.slice();
            }
        }
    
        if (currentSequence.length > 0 && parseInt(arr[arr.length - 1].value, 10) > parseInt(arr[arr.length - 2].value, 10)) {
            currentSequence.push(arr[arr.length - 1]);
            if (currentSequence.length > maxSequence.length) {
                maxSequence = currentSequence.slice();
            }
        }
    
        return maxSequence;
    }
    
    let arr1 = [{ value: '2' }, { value: '4' }, { value: '11' }, { value: '7' }, { value: '8' }, { value: '9' }];
    let arr2 = [{ value: '5' }, { value: '20' }, { value: '5' }, { value: '7' }, { value: '9' }, { value: '11' }];
    
    console.log(findSequence(arr1)); // (7, 8, 9)
    console.log(findSequence(arr2)); // (5, 7, 9, 11)

    Результат верный. Для первого вызова - (7, 8, 9), а для второго - (5, 7, 9, 11).

    К слову, код довольно кривой, так как это просто пример того, как найти определенную последовательность в массиве объектов. Подредактируй под свои нужды.
    Ответ написан
    1 комментарий
  • Регулярное выражение огрнаичение чисел только 4 и от 1900 до 2100?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    От 1900 до 2100:
    spoiler
    ^(19[0-9]{2}|20[0-9]{2}|2100)$
    Пример:
    let regex = /^(19[0-9]{2}|20[0-9]{2}|2100)$/;
    let test = regex.test("2000"); // возвращает true
    let test2 = regex.test("1899"); // возвращает false

    А если надо от 1990 до 2100 (в вопросе у тебя нашел как минимум три опечатки), то вот:
    spoiler
    ^(199[0-9]|20[0-9]{2}|2100)$
    Ответ написан
    Комментировать
  • Как отсортировать массив по значению?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Нужно преобразовать твой объект в массив, тогда можно сортировать штатной функцией.
    spoiler
    var data = {
        "ID": "414",
        "ELEMENT": {
            "5333": {
                "ID": "5333",
                "sort": 300,
            },
            "5334": {
                "ID": "5334",
                "sort": 500,
            },
            "5335": {
                "ID": "5335",
                "sort": 100,
            }
        }
    }
    
    // Преобразование объекта в массив
    var elementsArray = Object.keys(data.ELEMENT).map(function(key) {
        return data.ELEMENT[key];
    });
    
    // Сортировка массива по sort
    elementsArray.sort(function(a, b) {
        return b.sort - a.sort;
    });
    
    // Выводим массив в консоль
    console.log(elementsArray);

    А сортировка объекта просто не имеет смысла, т.к. порядок ключей (например, при переборе) там не гарантирован.
    Ответ написан
    Комментировать
  • Как задать условия для промежутков времени в js?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    1) с 09.00 до 10.59
    (hour >= 9 && hour < 11)

    2) с 11.00 до 16.59
    (hour >= 11 && hour < 17)
    Ответ написан
    Комментировать
  • К переменной в js не прибавляется число. Что не так?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Во-первых, чтобы в переменной min число увеличилось, его нужно туда записать,
    то есть присвоить переменной новое значение.
    Сделать это можно по-разному.
    (min + 1) это просто выражение, которое прибавляет единицу к min, но результат никуда не записывается.
    Нужно хотя бы так:
    min = min + 1
    Так мы сначала считаем выражение, а затем результат вычислений записываем в переменную min

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

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Очевидно, слово "King" не может однозначно соответствовать индексу, т.к. их несколько в массиве. Нужен другой подход (или их комбинация).

    Например, по координате в инпуте: getArrIndex(x), где x - координата в каких-то удобных вам единицах. Естественно, эту функцию нужно будет самому написать. Если текст с переносами, то придётся мутить что-то типа getArrIndex(x,y)

    Также можно попробовать ещё один подход: getLastWordIndex(text), в котором функция смотрит на последнее слово в тексте и выдаёт его номер. То есть здесь text - это весь текст от начала до позиции курсора включительно и включая слово под курсором, но всё остальное обрезано.

    Можно ещё что-нибудь придумать. Выбирайте, что вам кажется более удобным и разумным, - и реализуйте это.
    Ответ написан
    Комментировать
  • Чему равно foo.x? Почему?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Более простой пример:
    (код)
    var x = 5;
    var y = x--;
    console.log(y); //5

    В конечном счёте всё дело в очерёдности, с чем бы вы ни имели дело: с замыканиями, с промисами и т.д. Сам язык по своей идеологии - однопоточный.

    А вот так: foo.x = foo = {n: 2}; в реальной жизни, конечно же, делать не стоит, разве что вам нужна обфускация кода. Для удобочитаемости можно даже расставлять скобки там, где они не нужны и ни на что не влияют, чтобы подчеркнуть порядок выполнения вычислений. В данном же случае цепочку присвоений лучше разбить на строки.

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

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Правильным будет сначала понятным образом именовать переменные и функции, чтобы не запутаться. Также не следует ставить ; после объявления функций.
    let words = [
    	"",
    	"Hello",
    	"house",
    	"Velocity",
    	"orange",
    	"Gray",
    	"Intellegence",
    ];
    
    let SetRandomWord = function () {
    	let random
    	do {
    		Math.floor(Math.random()*3);
    	while (random >= words.length);
    	out.innerHTML = words[random];
    }
    
    let MakeInterval = function () {
    	setInterval(SetRandomWord, 1000);
    }
    
    button.addEventListener("click", MakeInterval);
    Ответ написан
  • Как понять следующее выражение на JS?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Если: s = t.charCodeAt(i)) < 128
    То: (n += String.fromCharCode(s), i++)
    Иначе: s > 191 && s < 224 ? (a = t.charCodeAt(i + 1) и дальше до конца.

    Тернарный оператор (в отличие от обычного if-else) имеет значение, но значение выражений и функций можно отбрасывать.
    Выражение: 1;
    будет верно, хотя оно и не имеет смысла, потому что результат отбрасывается, а само оно ничего не делает при этом.
    Такое: 1, 2;
    тоже верно, и такое: 1; 2;
    тоже.
    Тернарный оператор это всего лишь A ? B : C, где А,B,C - какие-то выражения. Так что можно записывать вместо if-else с отбрасыванием значения:
    x > 5 ? x-- : x++
    В случае обфускации может быть сложнее, типа A ? B : C ? D : E ? F, и скобки могут быть особым образом расставлены или специально опущены.

    P.S. Если в чём-то сомневаетесь, экспериментируйте, например, в консоли браузера. Легко сможете понять, как работает какая-то сложная штука в JS.
    Ответ написан
    1 комментарий
  • Как из одной функции, передать значение в другую функцию?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Например, через глобальную переменную:
    • Первая функция устанавливает значение глобальной переменной.
    • Вторая функция читает это значение, обращаясь к глобальной переменной.
    Ответ написан
    Комментировать
  • Как настроить вызов функции как только в массив что-то добавилось?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Сделайте функцию для добавления в массив, и пополняйте массив из разных обработчиков только через эту функцию. Она и будет той самой, что вам нужно вызывать при каждом добавлении.

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

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Сделайте скрипт, который анализирует разметку время от времени, находит там несоответствия, и затем отправляет всю разметку и её содержимое вам обратно, а также прочие интересные данные, которые помогут в поисках.

    Война вредоносного в защитного ПО - это война снаряда и брони; то есть эта война бесконечна, какие бы мотивы ни стояли в её основе. Так что если вы оказались втянуты в неё, придётся воевать в полную силу.
    Ответ написан
    1 комментарий
  • Как заставить делиться число пока результат не станет меньше или равно делителю?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Циклом while.
    Слово "пока" в задании как раз намекает на этот цикл.
    Ответ написан
    1 комментарий
  • Можно ли очищать setTimeout внутри setTimeout?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Можно.

    Только для setTimeout() это не имеет смысла, ибо он одноразовый.
    Это имеет смысл для setInterval()
    Ответ написан
    3 комментария
  • Как запретить ВКонтакте требовать входа, если страница уже открыта?

    dollar
    @dollar Автор вопроса
    Делай добро и бросай его в воду.
    Vest, спасибо за наводку,
    получилось так:
    vk.com##+js(ra.js, onmouseenter, *)

    Анимация перестала работать. Но так даже лучше)
    Ответ написан
  • Почему js делает неправильный hex?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    В UTF-8 есть правила. Поэтому не всякая бинарная строка является валидной UTF-8-строкой.
    spoiler
    Вот вам упрощённый пример. Представим, что вы переводите не в UTF-8, а в ASCII, и что главным правилом является нулевой восьмой бит. Пусть изначальная hex-строка будет FA. При переводе в ascii алгоритм видит, что это какая-то ошибка и решает исправить её, заменив на 7A (символ "z"). Далее при переводе в hex вы уже получаете 7A, а не FA, потому что информация о восьмом бите утеряна.

    Можете попробовать так. Возможно, это и решит вашу проблему X:
    var hex = "354d413043b4b440e1510b00";
    console.log(hex);       // 354d413043b4b440e1510b00
    
    var not_hex = (Buffer.from(hex, "hex").toString("binary"))
    console.log(not_hex);   // 5MA0C´´@áQ♂
    
    var hex_again = Buffer.from(not_hex, 'binary').toString("hex");
    console.log(hex_again); // 354d413043b4b440e1510b00
    console.log(hex === hex_again); // true
    Ответ написан
    3 комментария
  • Как правильно оформить код?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Применяется подход, я бы его назвал "отбрасывание хвоста", но возможно есть и официальное название. Работает внутри функции в виде досрочного выхода из неё.

    При if и if-else нужно как бы помнить все предыдущие if и держать их в голове. При отбрасывании хвоста всё наоборот - разум очищается, отработанные мысли выкидываются, и в голове обычно 1-2 условия нужно держать.

    Подход можно применить частично, потому что это может быть не тупая колбаса условий if, а else-ветвистая. Но каждую линейную ветвь точно можно превращать в маленький хвостик, а если рефакторить, то и ветки побольше. Главное, всё время стараться избавиться от лишнего ментального груза. Тогда код превращается в обычную прозу, где инструкции следуют одна за другой (императивно) без сложной многоступенчатой логики, и его становится легко читать и понимать.

    Для if:
    Конструкция
    if (condition_A) {
      instruction_A;
      if (condition_B) {
        instruction_B;
        if (condition_C) {
          instruction_C;
          .....
        }
      }
    }

    Превращается в (вложенности уходят):
    if (!condition_A) return;
    instruction_A;
    if (!condition_B) return;
    instruction_B;
    if (!condition_C) return;
    instruction_C;
    .....
    Для if-else:
    Конструкция
    if (condition_A) {
      instruction_A;
    } else if (condition_B) {
      instruction_B;
    } else if (condition_C) {
      instruction_C;
    } else if .....

    Превращается в обычный switch, либо снова в отбрасывание хвоста:
    if (condition_A) {
      instruction_A;
      return;
    }
    if (condition_B) {
      instruction_B;
      return;
    }
    if (condition_C) {
      instruction_C;
      return;
    }
    if .....


    Сложные ветки можно выделять в отдельные функции, это тоже как бы граница логики, перешагивая через которую можно позволить себе забыть часть кода, хоть и временно. Дело в том, что return работает на всю функцию целиком, в этом и есть его сила. Но на отдельную ветку он не применим, пока не выделить её в отдельную функцию, - тогда снова можно применять.

    Конечно, если есть повторы в условиях, как у вас, то можно как-то сообразить, как это представить в виде цикла (обхода массива любым способом), или скомбинировать разные ветки условий в одну с помощью && и ||, или опять-таки выделить в подфункцию. Сообразить = рефакторить. Обработку ошибок можно также оборачивать в try-catch, но это уже другая история.
    Ответ написан