• Как оптимизировать работу скрипта?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Надо перебирать в цикле имеющиеся значения. Удобнее держать данные (строки) в массиве массивов:
    data = [
        ["M166 E16", "A-Class", "2004", "A 160", "W168.II", "бензин"],
        ["M166 E19", "A-Class", "2004", "A 190", "W168.II", "бензин"],
        // и остальные данные. 
      ];


    Вытащить значения полей ввода лучше лишь 1 раз и запомнить в переменных:
    // вместо многократного
    ($("#class").val())
    // лучше один раз
    var _class = $("#class").val();
    // и потом использовать значение этой переменной


    Общий алгоритм: ищем, перебирая строки. Как только нашли, дальше не ищем. В конце смотрим, нашлось вообще что-то (показываем) или нет (пишем «нет результатов»).

    Поиск вызывает вопросы:
    1. точно ли ищете полное соответствие значений или достаточно подстроки;
    2. важен ли case (может, искать будут «БЕНЗИН» вместо «бензин»
    3. точно ли хотите искать каждое значение во всех полях строки? Например, год – известно же, что он в определённой колонке. Быстрее сравнивать искомый год только с одним полем.


    Сравниние с -1 короче записать так: !!~value – тоже будет false только если value == -1

    Итого
    $(document).ready(function() {
      const data = [
        ["M166 E16", "A-Class", "2004", "A 160", "W168.II", "бензин"],
        ["M166 E19", "A-Class", "2004", "A 190", "W168.II", "бензин"],
        ["M266 E15", "A-Class", "2005", "A 150", "W169.I", "бензин"],
        // и остальные данные. 
      ];
    
    
      $('.left').on('input', function() {
        const _class = $("#class").val(),
          _model = $("#model").val(),
          _god = $("#god").val(),
          _kuzov = $("#kuzov").val(),
          _tip = $("#tip").val()
        ;
        
        var index = -1; // сначала считаем, что "не найдено"
        
        for(let i = 0; i < data.length; i++) {
          let car = data[i];
          if( !!~car.indexOf(_class)
            &&  !!~car.indexOf(_model)
            &&  !!~car.indexOf(_god)
            &&  !!~car.indexOf(_kuzov)
            &&  !!~car.indexOf(_tip)
          ) {
            index = i;
            break;
          }
        }
        
        if(!!~index) {  // нашли и index стал больше -1
          $("#page-title").html( "Мотор " + data[i][0] );
        } else {        // не нашли и index === -1
          $("#page-title").html( "Нет такого" );
        }
      });
    });
    Ответ написан
    Комментировать
  • Можно ли в приложении увидеть друзей из вк?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Ответ написан
    Комментировать
  • Где посмотреть структуру современного приложения JS (ES6 модули)?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Ответ написан
    Комментировать
  • Как сделать одновременное редактирование документа, как в google docs?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Почитайте про шаблон проектирования «Команда».

    Понадобится слать из каждого клиента «команды» – каждый введённый символ, удалённый символ, удаление/вставка фрагмента текста, изменение форматирования. И всем редактирующим рассылать каждую полученную команду.

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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    попробуйте вместо
    if (document.form.name.value == '' || document.form.phone.value == '' ) {

    вот так:
    if (this.name.value == '' || this.phone.value == '' ) {
    Ответ написан
    Комментировать
  • Рисование 2d с помощью 3d моделей?

    SketchUp
    Ответ написан
    Комментировать
  • Как при нажатии на enter добавить?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    При копировании из HTML заменять <br> на \n.
    При копировании из textarea в div – наоборот, \n на <br>:
    document.getElementById("btn-from")
      .addEventListener('click',function(){
        elTa.value = elSrc.innerHTML
          .replace(/<br\/?>/ig, '\n')
          .replace(/\n+/g, '\n')
          .trim()
        ;
    });
    
    document.getElementById("btn-to")
      .addEventListener('click',function(){
        elSrc.innerHTML = elTa.value
          .replace(/\n/g, '<br>')
          .trim()
        ;
    });


    Рабочий пример
    Ответ написан
    Комментировать
  • Получение четного числа несколькими способами?

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    Верно. Способов несколько. Всего бесконечность минус 1:

    Берём любое случайное целое. Умножаем на 2. Это первое чётное.
    Проверяем, что результат не равен половине исходного числа – это единственное исключение.
    Второе чётное – это из исходного вычесть первое.

    Разница двух чётных – число чётное. Неравенство слагаемых мы гарантируем проверкой единственного случая выше.
    Ответ написан
  • Как с помощью циклов определить простое или составное число?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Всего два возможных исхода: «простое» или «составное».
    Случай с составным правильно определяется в варианте, где вы поставили break.

    Но там не break нужен. У вас функция, которая должна вернуть значение. Как только обнаружили, что найден делитель, всё, можно сразу возвращать результат «Составное число».

    Я бы порекомендовал такую логику: в цикле только ловите ахтунг-момент найденного делителя - и сразу возвращайте "Составное". Если же весь цикл отработал и не вылетел из функции, возвращайте "Простое". Не надо никаких «флагов» и доп. переменных. Код получается короткий и понятный.

    spoiler
    function testCycle(n) { 
      for (let i = 2; i < n / 2; i++)
        if (n % i === 0)
          return "Составное число"; 
      return "Простое число";
    }

    Примечания:
    • let – это то же, что и var, но действует не в рамках всей функции, а только в рамках блока. В данном случае, внутри цикла.
    • === – это «строгое» равенство. То же, что и ==, но ещё и проверяет, чтобы типы совпадали, т.е. не прокатит "0" === 0. Зато работает чуть быстрее.
    • проверяем не до n, а до n / 2, т. к. целые множители не могут превышать половину произведения (второй множитель не меньше 2)
    Ответ написан
    Комментировать
  • Что делать после todo?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Сделайте вложенный todo: где задачи 1-го уровня из себя представляют списки задач.
    Ответ написан
    Комментировать
  • Почему не срабатывает копирование в буфер?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В буфер можно записывать только по действию пользователя: в обработчике клика, например. Но никак не по асинхронному событию где-то в коде.
    You can use the "cut" and "copy" commands without any special permission if you are using them in a short-lived event handler for a user action (for example, a click handler).


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

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    Это типичная задача упаковки (packing problem).

    В «коробку» длиной 100 и шириной K надо впихнуть комплект колбас шириной 1 и разной длины.
    Ответ написан
    Комментировать
  • Как после "10" вызовов function write() в сек, блокировать её на "10мин"?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    На стороне сервера – надо сохранять массив времен последних вызовов функции. При очередном вызове смотреть число времен в этом массиве и время самого раннего. Дописывать в конец текущее время и удалять записи старше 1 секунды.

    В качестве хранилища можно использовать Redis или другое хранилище в памяти.

    Если квота распространяется на каждого юзера в отдельности - хранить для каждого отдельно. В качестве ключа использовать в т.ч. user_id.

    На клиенте похожий принцип: хранить массив времен вызовов и проверять число и время самого раннего при каждом.
    Ответ написан
    Комментировать
  • Что делает этот код php?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Перебирается массив серийников. Путём нехитрых битовых операций сравниваются производные от URL и от последних двух частей в серийнике. Если совпадают, в массив Core::$url дописывается ключ "key" со значением подошедшего ключа.

    Разобрать длинную строку удобнее, разбив конструкцию:
    $d = array('test-site', 'ru');
    $e = array('ST-214E2210-33FE865E-EC05E9A3', 'ST-204C2010-3DEFEFBE-C30E1243', 'ST-214E4000-3D4F3356-E2BCEEBB');
    
    do {
      $b = implode('.', $d); // склеили, получили "test_site.ru"
              
      foreach ($e as $sKey){ // перебираем ключи
        $a = explode('-', $sKey) + array(0, 0, 0, 0); // разбили по дефису в массив,
        // убедились, что в массиве как минимум 4 элемента (если меньше, допис. нулями)
                    
        !( // логическое отрицание того, что в скобках
        	Core::convert64b32( // из 64 бит в 32
        		Core::convert64b32(
        			hexdec($a[3]) // последний фрагмент ключа перевели из 16-ричного в 10-е число
        		) 
        		^  // ксор, побитовое исключающее ИЛИ
        		abs(Core::crc32($b))  // 32-битное число, хэш из адреса сайта
        	) 
        	^  // XOR см. выше
        	~(  // побитовое отрицание
        		Core::convert64b32(
        			Core_Array::get( // тут из конфига получают значение "hostcms" 
        				Core::$config->get('core_hostcms'),
        				'hostcms'
        			)
        		) 
        		&  // побитовое И
        		abs(Core::crc32($b))
        		^
        		Core::convert64b32(
        			hexdec($a[2]) // предпоследний фрагмент из ключа, как число
        		)
        	)
        )
        &&  // только если выше в скобках получился 0, выполнится следующая строка
        Core::$url['key'] = $sKey;
      }
      array_shift($d);
    } while(count($d) > 1);
    
    $a = explode('-', $sKey) + array(0, 0, 0, 0);
    Ответ написан
    Комментировать
  • Как разворачивать и сворачивать (2 и более статей не получается)?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Не работает потому, что функцию sh() переопределяете для каждой статьи заново – остаётся последний вариант.

    Лучше сделать так:
    1. Скрываемым частям статей давать класс с display:none У вас это text__podzigilovol.
    2. В ссылке-кнопке для спрятать/показать записывать id управляемой статьи в data-атрибуте: data-id="info-2" – так кнопка будет «знать», кем она управляет.
    3. Кнопкам не писать в href никакого javascript:..., вместо этого лучше на них повесить слушателя события клика. Удобно дать всем кнопкам определённый класс, по нему их отыскать и в цикле повесить слушателя события.
    4. Обработчик клика описывается лишь один раз. Он получает в качестве this кликнутую ссылку. Из неё берёт data-атрибут с id нужного блока. И включает/выключает ему класс, который прячет этот блок.
    Рабочий пример
    Код
    function sh(event) {
      const className = "text__podzigilovol";
      event.preventDefault();
    
      obj = document.getElementById(this.dataset.id);
      if(!obj) return;
      if( obj.classList.contains(className)) {
        obj.classList.remove(className);
      } else {
        obj.classList.add(className);
      } 
    } 
    
    
    Array.prototype.forEach.call(
      document.querySelectorAll('.js-btn-readmore'),
      function(e){
        e.addEventListener('click', sh);
      }
    );
    Ответ написан
    8 комментариев
  • Как составить строку из значений нескольких переменных php?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Выбирайте:
    "$a$b$c";     //  в двойных кавычках подставляются значения (интерполяция)
    $a . $b . $c; // точка - оператор конкатенации
    implode('', [$a, $b, $c]);     // склеиваем массив 
    sprintf('%s%s%s', $a, $b, $c); // "печатаем" по формату и возвращаем результат
    Ответ написан
    Комментировать
  • Как сравнить элементы многомерного массива между собой?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Сортируйте наборы и склеивайте в строку – используйте полученные строки как ключи массива. Значения – массивы ключей исходного.

    Так получите под одним ключем "cloo" два значения ["cool", "looc"], а для остальных по одному.

    spoiler
    <?php
    $data = [
    	"cool" => [0 => "c", 1 => "o", 2 => "o", 3 => "l"],
      "looc" => [0 => "l", 1 => "o", 2 => "o", 3 => "c"],
      "test" => [0 => "t", 1 => "e", 2 => "s", 3 => "t"],
      "set"  => [0 => "s", 1 => "e", 2 => "t"],
      "get"  => [0 => "g", 1 => "e", 2 => "t"]
    ];
    
    $groups = [];
    foreach( $data AS $k => $v) {
    	sort($v);
    	$hash = implode('', $v);
    	if(!isset($groups[$hash])) $groups[$hash] = [];
    	array_push($groups[$hash], $k);
    }
    $result = array_values($groups);
    
    print_r($result);
    /*
    Array(
        [0] => Array
            (
                [0] => cool
                [1] => looc
            )
    
        [1] => Array
            (
                [0] => test
            )
    
        [2] => Array
            (
                [0] => set
            )
    
        [3] => Array
            (
                [0] => get
            )
    )
    */
    Ответ написан
    3 комментария
  • Из строки с "часами", сделать таймер?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    «Закидывайте» и «ловите» не сколько осталось, а время того события, до которого отсчитываете. В виде Unix timestamp'а, целого числа. Так всегда сможете посчитать, сколько осталось.
    Ответ написан
    Комментировать
  • Как заменить элементы одного массива элементами другого по заданному правилу?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Забыли .length – вероятно, собирались перебирать i от 0 до длины строки arr1. Тут не массивы, а две строки.

    for (i=0; i<arr1.length; i++) {
        for (j=0; j<arr2.length; j++){


    Вложенный цикл не нужен. Достаточно перебрать каждую цифру входа.

    Чтобы найти соответствующую цифре i букву, достаточно взять i-й элемент строки arr2:
    arr2[ i ];

    Коротко, в одну строку это можно решить через преобразование строки в массив и применение функции к каждому элементу.
    В одну строку
    var arr1 = '3649824598';
    var arr2 ='АБВГДЕЖЗИК';
    
    arr1.split('').map(n => arr2[n]).join('')  // ГЖДКИВДЕКИ

    • split('') сделает из строки массив цифр;
    • map() применит к каждой цифре функцию, которая заменит цифру на соотв. букву из arr2;
    • join('') склеит элементы массива (теперь уже буквы) в одну строку.
    Ответ написан
    Комментировать
  • Как на самом деле передаются биты по сетевому кабелю?

    Поиск сначала по фразе «витая пара», а затем по «10BASE-T» привёл к вики, где пишут, что
    модуляция сигнала - фазовая. На один бит отводится один период. Смена фазы колебаний означает смену логического состояния от 0 к 1 или наоборот


    Т.е. в проводах «гудит» синусоида с частотой 10МГц и амплитудой +/– 2 Вольта. Фаза иногда меняется. Так, если бы буква "b" передавалась непосредственно как 01100010, это заняло бы 8 периодов, т.е. 8/10000-х секунды, и фаза поменялась бы 4 раза.
    Ответ написан
    Комментировать