Задать вопрос
  • Будут ли разной скорость загрузки трех изображений из одного источника и трех изображений из разных?

    HTML
    • Три тега с общим одинаковым src загрузят картинку один единственный раз и покажут в трёх местах.
    • Три тега с разными src загрузят три разные картинки.

    Второй вариант включает в себя первый плюс загружает две другие картинки. Значит, он не быстрее первого. Может оказаться так же по времени, а может, дольше.

    HTTP

    Случай трёх разных картинок ещё интересно рассмотреть с т.з. передачи от сервера в браузер.

    Если веб сервер работает по протоколу HTTP/1.1, то 3 картинки это 3 разных запроса. Для каждого устанавливается новое соединение. Скачивание идёт параллельно.
    Если по протоколу HTTP/2, то соединение одно, и 3 запроса выстроятся последовательно. Экономия на установлении новых соединений.

    В теории оба варианта используют доступный канал по максимуму, поэтому HTTP/2 должен быть быстрее за счёт экономии на времени установления новых соединений.
    Какой из двух протоколов окажется быстрее на практике, зависит ещё и от внешних факторов, поэтому сложно однозначно заявить.

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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    random(6) возвращает целое: 1, 2, 3, 4, 5 или 6 – с равной вероятностью.
    Как игральные кости (кубики).

    Чтобы reduce/length дал единицу,
    нужно, чтобы все шесть выпали именно единицы:
    (1 + 1 + 1 + 1 + 1 + 1) / 6 == 1

    Вероятность шести единиц
    1/6 * 1/6 * 1/6 * 1/6 * 1/6 * 1/6  = 1 / 6^6 = 0,00002143347051
    = 2 тысячные процента. Всего ничего.
    Ответ написан
    Комментировать
  • Как удалить все текстовые элементы со страницы через js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    можно использовать treeWalker:

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

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    [[1, 2, 3],[4, 5, 6],[7, 8, 9]].map(arr => arr.reduce((acc, c) => acc + c)) 
    // [ 6, 15, 24 ]


    Объяснение
    Каждый элемент внешнего массива трансформируется в число:
    [
      [1, 2, 3] --> 6
      [4, 5, 6] --> 15
      [7, 8, 9] --> 24
    ]
    — это операция map(): каждый-в-каждый.

    Теперь суть каждого такого преобразования. Из массива получить единственное значение — это reduce()

    Сложить все элементы массива и вернуть сумму. Аккумулятором будет эта самая сумма. Очередное значение складывать с накопленным аккумулятором и возвращать сумму.
    reduce( (accumulator, current) => accumulator + current )
    с обычной функцией
    reduce(
      function(accumulator, current) {
        return accumulator + current;
      }
    )

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

    Надо давать элементам списка уникальный ключ – атрибут key.
    Так React поймёт, какие элементы удалены, добавлены.

    Индекс массива не подходит для значения key. Нужно что-то уникальное, характерное для каждого элемента массива, что не изменится при изменении порядка, скажем.

    В примере в вопросе, видимо, уникальны сами значения 1, 2, 3 – можно их использовать для атрибута key:
    arr.map(el => <TimerComponent name={el} key={el} />)
    Ну и массивы в стейте, помните, надо не мутировать, а заменять массив целиком на новый.

    Чтобы не перерендерился каждый раз вложенный компонент, можно его «мемоизировать»: обернуть в React.memo(), снабдив функцией, которая сравнивает предыдущее состояние и новое, и делает вывод, надо ли перерендерить. Тут, например, не надо перерендерить, если N остался тот же. Упрощённый Codepen:
    для сравнения в коде App закомментируйте-раскомментируйте соседние строки, чтобы вместо ItemMemo работал просто Item
    Ответ написан
    5 комментариев
  • Почему в python при таком арифметическим действием (3**2%7) при расчете ответ будет 2?

    гуглить "python operator precedence"

    Результат: Expressions - 6.17. Operator precedence
    Там таблица. Чем выше строка, тем выше приоритет.
    Возведение в степень ** выше остатка от деления %,
    поэтому сначала в степень 3**2 == 9, уже потом деление по модулю на 7 (остаток == 2)
    Ответ написан
    1 комментарий
  • Как сложить все значения массива по квартально?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    добавить поле квартала: год-квартал, что-то типа
    data.map(({ day, ...rest }) => {
      const quarter = ['I', 'II', 'III', 'IV'][Math.floor((+day.substring(5, 7) - 1) / 3)];
      const year = day.substring(0, 4);
      const hash = `${year}-${quarter}`; // "2022-IV"
      return { hash, day, ...rest };
    })
    Результат
    [
      {
        "hash": "2021-III",
        "day": "2021-07-23T00:00:00",
        "speed": 3283,
        "distance": 3283,
        "wagons": 1
      },
      {
        "hash": "2021-III",
        "day": "2021-09-26T00:00:00",
        "speed": 1879,
        "distance": 1879,
        "wagons": 1
      },
      {
        "hash": "2022-I",
        "day": "2022-03-11T00:00:00",
        "speed": 10372,
        "distance": 15558,
        "wagons": 3
      },
      {
        "hash": "2022-III",
        "day": "2022-07-25T00:00:00",
        "speed": 455,
        "distance": 455,
        "wagons": 1
      },
      {
        "hash": "2022-III",
        "day": "2022-09-24T00:00:00",
        "speed": 3720.0666666666666,
        "distance": 18632,
        "wagons": 11
      },
      {
        "hash": "2022-IV",
        "day": "2022-10-01T00:00:00",
        "speed": 55944.81598981719,
        "distance": 1227358,
        "wagons": 805
      },
      {
        "hash": "2022-IV",
        "day": "2022-11-01T00:00:00",
        "speed": 35877.33829052166,
        "distance": 6621346,
        "wagons": 5528
      },
      {
        "hash": "2022-IV",
        "day": "2022-12-01T00:00:00",
        "speed": 39757.51849326638,
        "distance": 9322141,
        "wagons": 7258
      },
      {
        "hash": "2023-I",
        "day": "2023-01-01T00:00:00",
        "speed": 16726.83149608712,
        "distance": 1022607,
        "wagons": 794
      }
    ]
    Ответ написан
  • Как сложить все значения массива по полю месяца?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Стоит включить и год, и месяц в хэш, а то мало ли, более 1 года попадёт в выборку.
    const props = ['speed', 'distance', 'wagons'];
    
    const result = data.reduce((acc, c) => {
      const yearMonth = c.day.substring(0, 7); // '2022-03'
      props.forEach(prop => {
        acc[prop][yearMonth] = (acc[prop][yearMonth] ?? 0) + c[prop];
      });
      return acc;
    }, Object.fromEntries(props.map(prop => [prop, {}])));
    Результат
    {
      "speed": {
        "2022-09": 22452,
        "2022-10": 65668.58282444967,
        "2022-11": 6397.635863857564
      },
      "distance": {
        "2022-09": 68752,
        "2022-10": 1119233,
        "2022-11": 289732
      },
      "wagons": {
        "2022-09": 26,
        "2022-10": 427,
        "2022-11": 176
      }
    }


    Другой вариант:
    const hashMap = data.reduce((acc, { day, ...rest }) => {
      const hash = day.substring(0, 7);
      if (Object.hasOwn(acc, hash)) {
        Object.keys(rest).forEach(prop => acc[hash][prop] += rest[prop]);
      } else {
        acc[hash] = { day: hash, ...rest };
      }
    
      return acc;
    }, {});
    
    const result = Object.values(hashMap);
    Результат
    [
      {
        "day": "2022-09",
        "speed": 22452,
        "distance": 68752,
        "wagons": 26
      },
      {
        "day": "2022-10",
        "speed": 65668.58282444967,
        "distance": 1119233,
        "wagons": 427
      },
      {
        "day": "2022-11",
        "speed": 6397.635863857564,
        "distance": 289732,
        "wagons": 176
      }
    ]
    Ответ написан
    3 комментария
  • Как получить все элементы массива по data-атрибутам?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    data-атрибуты должны непременно начинаться именно с "data-" с дефисом.

    Ответ написан
    3 комментария
  • Как отсортировать элементы внутри массива?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Из NodeList можно сделать массив со всеми его методами: const arr = Array.from(myNodeList);
    Значение внутри элемента div: const text = div.textContent;

    function func1() {
      // сделать массив с этими дивами
      const divs = Array.from(document.querySelectorAll(".data > div"));
    
      // отсортировать, интерпретируя текст как числа
      divs.sort((a, b) => +b.textContent - +a.textContent);
    
      // куда их всех переставлять
      const result = document.querySelector(".result");
    
      // пока в массиве что-то есть, берём последний и вставляем в result
      while(divs.length) {
        result.appendChild(divs.pop());
      }
    }
    func1();
    Ответ написан
    1 комментарий
  • Формирование Даты?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно использовать стандартные средства браузера:
    • объект Date(), который прекрасно переварит строку в стандартном формате "2023-01-12T07:00:03Z"
    • и Intl.DateTimeFormat() для форматирования даты
    const formatter = new Intl.DateTimeFormat('ru-RU', {
      dateStyle: 'long',
      timeStyle: 'short',
    });
    const date = new Date('2023-01-12T07:00:03Z');
    
    formatter.format(date)
    // "12 января 2023 г., 10:00"
    в то время как в Лондоне 7 утра, в Москве 10:00 (в часовом поясе браузера)
    Ответ написан
    Комментировать
  • Как проверить, что элементы с атрибутом required заполнены?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно использовать встроенную валидацию, которую поддерживают современные браузеры.

    В простом варианте селекторами input:required и select:required можно выбрать все инпуты с атрибутом required.

    Для radio достаточно указать required у первого элемента.
    Для select опции-затычке надо указать value="" и добавить атрибуты disabled hidden selected, чтобы такая опция не считалась заполнением.

    При клике на следующих табах, или псевдо-кнопке внизу, проверять у текущих инпутов свойства element.validity.valueMissing:
    true означает пустоту обязательного поля. Когда не все поля валидны, то preventDefault() событию предотвратит переключение таба.
    Ответ написан
    4 комментария
  • Почему при нажатии на второй чек бокс срабатывает первый?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    id должны быть уникальными.
    <?php
    foreach ($logs as $i => $val) { ?>
    ...
    <input type="checkbox" id="switch-1-<?php echo $i; ?>" 
    ...
    <input type="checkbox" id="switch-2-<?php echo $i; ?>"
    Ответ написан
  • Как получить новый объект с посчитанными суммами?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Наскоро, так:
    const output = Object.fromEntries(Object.values(obj).map(name => [name, 0]));
    
    items.forEach(({ id, price }) => {
      if (!Object.hasOwn(obj, id)) return;
      output[obj[id]] += price;
    });
    
    output.total = Object.values(output).reduce((acc, c) => acc + c);
    // { first: 80000, second: 80000, total: 160000 }
    Ответ написан
    1 комментарий
  • Как решить проблему с кодировкой на macbook Pro 2017?

    Вероятно, клавиша Option (Alt) залипла.

    µ°∆©©©©©©© – это всё обычная клава с Alt (и Shift для градуса)
    Ответ написан
    Комментировать
  • Как создать событие?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Свойства - геттеры и сеттеры

    В простом варианте, сразу обрабатывать все условия:
    const obj = {
      _x: 0,
      get x() {
        return this._x;
      },
      set x(value) {
        this._x = value;
        if (this._x === 5) {
          console.log('Пятёрочка!');
        }
      },
    };
    
    // использование
    obj.x = 5; // Пятёрочка!


    С добавлением фильтров можно поступить так:
    const obj = {
      _x: 0,
      _filters: {},
      addFilter(value, callback) {
        this._filters[value] = callback;
      },
      get x() {
        return this._x;
      },
      set x(value) {
        this._x = value;
        this._filters[value]?.(value);
      },
    };
    
    // добавить обработчики
    obj.addFilter(5, () => console.log('Пятёрочка!'));
    obj.addFilter(10, v => console.log(`${v} это десять!`));
    
    // использование
    obj.x = 10; // 10 это десять!
    Ответ написан
    4 комментария
  • Как вернуть первоначальное значение переменной при повторном выполнении функции?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    можно стилями обрезать:
    .truncate {
      width: 250px; /* подставьте вашу ширину блока */
      white-space: nowrap;
      overflow: hidden;
      text-overflow: ellipsis;
    }


    Комментарии по коду в вопросе:
    • метод строки link() — устаревший и не рекомендуется к использованию.
    • метод slice() есть и у строки, т.ч. не обязательно преобразовывать строку в массив и обратно.
    • вместо строки '...' можно использовать HTML-символ &hellip; (троеточие одним символом)
    • ; в конце строк кода лучше не пропускать
    Ответ написан
    1 комментарий
  • Как с html формы собирать данные в .txt?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Начните с упрощенной формы с единственным полем и кнопкой submit. Добейтесь, чтобы данные записывались в файл.

    Полям надо давать имя: атрибут name Например
    <input type="text" name="first_name" placeholder="First name">
    
    <select name="day_of_week">
      <option value="1">Monday</option>
      <option value="2">Tuesday</option>
      <option value="3">Wednesday</option>
    </select>


    PHP примерно такой:
    <?php
    $filename = 'form_responses.txt';
    
    if (!empty($_POST)) {
        $record = [
            // перечисляются поля формы
            'first_name' => filter_input(INPUT_POST, 'first_name', FILTER_SANITIZE_STRING),
            'day_of_week' => filter_input(INPUT_POST, 'day_of_week', FILTER_SANITIZE_NUMBER_INT),
        ];
    
        $recordString = implode('; ', $record) . PHP_EOL; // склеить значения через точку с запятой
    
        file_put_contents($filename, $recordString, FILE_APPEND);
    }
    Ответ написан
    Комментировать
  • Делегирование vs цикл, что лучше в целом и какие плюсы и минус?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    События так и так «катаются» по всему документу:
    ныряют от window через document, body и все родительские элементы, до кликнутого элемента
    и всплывают всю дорогу обратно до window. Почему бы не ловить их один раз, выше дна?

    Ещё один плюс: динамическое добавление новых дочерних элементов, на которых клики тоже понадобится обрабатывать. С делегированием не придётся дополнительно вешать обработчик: клик по новичкам будет обработан.
    Ответ написан
    2 комментария