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

    0xD34F
    @0xD34F Куратор тега JavaScript
    Вместо массива расстояний до заданной точки достаточно хранить одно минимальное. При обработке элемента locations вычисляете расстояние, сравниваете с текущим минимальным, если оно всё ещё меньше - ничего не делаете, в противном случае запоминаете новое минимальное и соответствующий ему элемент массива locations:

    const getTheNearestLocation = (locations, [ x, y ]) =>
      locations.reduce((nearest, n) => {
        const d = ((n[1][0] - x) ** 2 + (n[1][1] - y) ** 2) ** 0.5;
        return nearest[1] < d ? nearest : [ n, d ];
      }, [ null, Infinity ])[0];
    Ответ написан
    5 комментариев
  • Как сделать одновременное скачивание нескольких файлов по клику на один элемент?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Один запрос – один ответ.
    Вариант – упаковка в архив.
    Еще вариант – по клику открывать три новых окна/вкладки, в каждой из которых будет скачиваться соответствующий файл.
    Ответ написан
    1 комментарий
  • Как мне сделать валидацию этой формы?

    Классный плагин HandMadeOnJS, вот пример его работы:


    У вас написано:
    Дмитрий @WafelT
    HTML/CSS/JavaScript - и с таким стеком знаний не можете валидацию написать?

    P.S. С праздниками!
    Ответ написан
    1 комментарий
  • Как вывести три наибольших значения из массива?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Выдёргиваем из объектов значения, сортируем, берём сколько надо крайних, собираем строку:

    const result = arr
      .map(Object.values)
      .sort((a, b) => b - a)
      .slice(0, 3)
      .join(', ');

    Конечно, по-хорошему, вместо map следовало бы использовать flatMap, но пока в элементах массива содержится по одному свойству - и так сойдёт.
    Ответ написан
    3 комментария
  • Что нужно знать перед изучением Webpack?

    @Undefinedy
    Вам нужно поставить себе цель зачем вам вебпак)
    webpack это лишь оболочка над кучей плагинов и лоадеров. Дефолтный (к примеру) vue cli проект уже настраивает вебпак плагины и множество лоадеров. Посмотреть это вы можете к примеру через yarn vue-cli-service inspect
    К примеру поставьте себе цель добиться максимально-возможной оптимизации сайта, Начните с css/html/js. (тоесть CssMinimizerWebpackPlugin/HtmlWebpackPlugin/TerserPlugin). Попробуйте настроить оптимизаторы так чтоб код после них не нуждался в обфускаторах.
    Поиграйтесь с лоадерами заставляя их работать только как препроцессоры. Возможно в процессе вы столкнетесь с тонкостями асинхронного js. Поиграйтесь с SEO-оптимизацией. В процессе вы вероятно столкнетейсь с нехваткой документации и научитесь разбирать код чужих лоадеров. Пока я где-то на этом этапе))
    PS: без WEBPACK-а никак. Вообще никак. Нет и даже так без него никак
    Ответ написан
    Комментировать
  • Как перебрать все суммы массива?

    @coldhand Автор вопроса
    Student
    Действительно, битовые операции я и не думал использовать, спасибо. Прикреплю простенький пример для следующих искателей:
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	int const n = 3;
    	int intArray[n];
    	int sum;
    
    	for (int i = 0; i < n; i++)
    	{
    		cin >> intArray[i];
    	}
    
    	for (int mask = 0; mask < (1 << n); ++mask)
    	{
    		sum = 0;
    		for (int i = 0; i < n; i++)
    		{
    			if (mask & (1 << i))
    			{
    				sum = sum + intArray[i];
    			}
    		}
    		cout << sum <<" ";
    	}
    
    	return 0;
    }
    Ответ написан
    Комментировать
  • Как перебрать все суммы массива?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Можно не рекурсивно.

    Перебирите все битовые маски (числа) от 0 до 2^n -1 (mask = 0; mask < (1 << n); ++mask).

    А внутри при подсчете суммы пройдитесь по всем позициям массива и, если i-ый бит установлен, прибавляйте текущее число. Проверить, что бит установлен можно сделав побитовое и (&) c 1 << i.

    Если хотите рукурсивно, то пусть ваша функция принимает текущую позицию и сумму. Если позиция равна n - выводите сумму. Иначе запускайтесь рекурсивно от следующей позиции два раза - с текущей суммой без изменения, и с суммой увеличенной на текущее число.
    Ответ написан
    Комментировать
  • Как найти в тексте и заменить значение по маске?

    0xD34F
    @0xD34F
    preg_replace_callback('#\[~(.*?)~\]#', fn($m) => $arr['person'][$m[1]], $str)
    Ответ написан
    Комментировать
  • Как получить текст после ";"?

    0xD34F
    @0xD34F Куратор тега JavaScript
    str.split(';').pop()
    // или
    str.replace(/.*;/, '')
    // или
    str.match(/;(.*)/)[1]
    // или
    /[^;]+$/.exec(str).shift()
    // или
    str.slice(str.lastIndexOf(';') + 1)
    // или
    [...str].reduce((acc, n) => n === ';' ? '' : acc + n)
    // или
    Array.from(str).filter((n, i, a) => !a.includes(';', i)).join('')
    Ответ написан
    Комментировать
  • Как выровнять длину массивов в массиве?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Собрать новый массив:

    const newArr = arr.map(function(n) {
      return [ ...n, ...Array(this - n.length).fill('') ];
    }, Math.max(...arr.map(n => n.length)));

    Обновить существующий:

    const max = arr.reduce((max, { length: n }) => max > n ? max : n, 0);
    arr.forEach(n => n.push(...Array(max - n.length).fill('')));
    Ответ написан
    2 комментария
  • Правильно ли я написал?

    @calculator212
    ошибка может быть здесь Math.Cos(2.0 * Math.PI * x / 3.0 - 1.4), т.к. нужно смотреть как высчитывается косинус, например Cos(1) это косинус 1 радиана или косинус 1 радиуса, по хорошему в калькулятор забейте каждое действие по отдельности потом в программе также сделайте, сравните результат и узнаете где ошибка
    Ответ написан
    1 комментарий
  • Как запретить выполнение события при клике по дочернему элементу?

    @L1nks
    Немного странная структура html.
    Если вам надо, чтобы у вас была кнопка, которая чистит значение в инпут и при этом сам инпут был внутри этой кнопки, то лучше сделать так
    <button class="button-third">
      <input type="text" class="input-third" />
      X
    </button>


    document.querySelector(".button-third").addEventListener("click", (evt) => {
    	console.log("button click")
    });
    
    document.querySelector(".input-third").addEventListener("click", (evt) => {
    	evt.stopPropagation();
    	console.log("input click")
    });


    Чтобы события с дочернего элемента не поднимались вверх и не вызывали родительские, вам необходимо использовать stopPropagation()
    Документация: тык
    Ответ написан
  • Как принять пробел в строку из пользовательского ввода?

    nowm
    @nowm
    В C++ есть getLine, и он читает всю строку:

    #include <string>
    #include <iostream>
    
    int main()
    {
       std::string words;
       
       std::cout << "Введите слова: ";
       std::getline(std::cin, words);
       
       std::cout << "Слова: " << words << "\n";
    }
    Ответ написан
    2 комментария
  • Почему один и тот же код работает в "стрелочной функции", но не работает в "функциональном выражении"?

    @cokpat469 Автор вопроса
    const getCode = function(s) { return s.slice(0, 3).toUpperCase();}


    Спасибо edward_freedom и Fedor Vlasenko
    Ответ написан
    Комментировать
  • Как собрать все элементы объекта?

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

    const getFromTree = (tree, childrenKey, getter = n => n) =>
      Array.isArray(tree)
        ? tree.flatMap(n => [
            getter(n),
            ...getFromTree(n[childrenKey], childrenKey, getter),
          ])
        : [];
    
    // или
    
    function* flatTree(tree, childrenKey) {
      if (
        tree instanceof Object &&
        tree[Symbol.iterator] instanceof Function
      ) {
        for (const n of tree) {
          yield n;
          yield* getFromTree(n[childrenKey], childrenKey);
        }
      }
    }

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

    const getFromTree = function(tree, childrenKey, getter = n => n) {
      const result = [];
    
      for (const stack = this(tree); stack.length;) {
        const n = stack.pop();
        result.push(getter(n));
        stack.push(...this(n[childrenKey]));
      }
    
      return result;
    }.bind(x => x instanceof Array ? [...x].reverse() : []);
    
    // или
    
    const flatTree = function*(tree, childrenKey) {
      const stack = [];
    
      for (let [ i, arr ] = this(tree); ++i < arr.length || stack.length;) {
        if (i === arr.length) {
          [ i, arr ] = stack.pop();
        } else {
          yield arr[i];
          stack.push([ i, arr ]);
          [ i, arr ] = this(arr[i][childrenKey]);
        }
      }
    }.bind(x => [ -1, x?.constructor === Array ? x : [] ]);

    Перебираем вложенные объекты:

    getFromTree(tree, 'children').forEach(n => console.log(n));
    
    // или
    
    for (const n of flatTree(tree, 'children')) {
      console.log(n);
    }
    Ответ написан
    Комментировать
  • Как присвоить значение одного элемента массива в другой элемент массива?

    0xD34F
    @0xD34F
    $values = array_combine(
      array_column($example2, 'SECTION_ID'),
      array_column($example2, 'VALUE')
    );
    
    $example3 = array_map(function($n) use($values) {
      $n['VALUE'] = $values[$n['SECTION_ID']];
      return $n;
    }, $example1);
    Ответ написан
    1 комментарий
  • Как по-человечески найти нужный элемент в списке?

    Vindicar
    @Vindicar
    RTFM!
    Ты хочешь указывать ячейку как в морском бое, а1-в3?
    Тогда работай отдельно по строкам и столбцам, так будет проще.
    field = [
      [' ', ' ', ' '],
      [' ', ' ', ' '],
      [' ', ' ', ' '],
    ]
    #обращение к ячейке будет таким: field[1][1] 
    
    columns = ['1', '2', '3'] #обозначения столбцов
    rows = ['a', 'b', 'c'] #обозначения строк
    
    def cell2index(cell):
      # превращаем строку вида b1 в индексы в списке
      row = rows.index(cell[0].lower()) #если номера строки нет, вылетит исключение ValueError
      col = columns.index(cell[1]) #если номера столбца нет, вылетит исключение ValueError
      return row, col #возвращаем кортеж - пару значений
    
    # пример работы - ход крестиков
    while True: #повторяем, пока пользователь не введет правильный номер
      cell = input('Введите ячейку для хода: ')
      try:
        r, c = cell2index(cell) #если номер неверный, тут вылетит исключение ValueError
        if field[r][c] != ' ': #ячейка уже занята?
          print('Ячейка уже занята!')
        else:
          break #если исключения не было, выходим из цикла
      except ValueError:
        print('Номер ячейки неправильный')
    #сюда попадём только если номер ячейки правильный и она свободна
    field[r][c] = 'x'
    Ответ написан
    2 комментария
  • Как переписать тернарный оператор в нормальный вид?

    coderisimo
    @coderisimo
    if($this->request->post['name']){
    $name = $this->request->post['name'];
    }
    else{
    $name = 'default';
    }

    Вопрос - зачем ? :)
    Ответ написан
    Комментировать
  • Как сделать дерево объектов из массива?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Не специалист по JS, но похоже там можно сделать проще чем стандартный обход графа в ширину/глубину.

    Заведите мап объектов, которые будете собирать. Ключи будудт айдишники, а значения - объекты. У объектов заполните uid, parentUID, пустой Map children и пустой список children_list. Так же запомните куда-то id, у которого null отец.

    Потом еще одним проходом по списку всех элементов заполните children_list у всех обхектов в Map из прошлого шага (кладите текущий id в список для parentUID).

    Потом еще одним проходом по всем элементам этого Map соберите дерево: обойдите список детей и в Map children кладите 'id' => объект из внешнего Map'а по данному ключу. После прохода можно children_list удалить.

    Если я правильно понимаю, как работает JS, то у вас будет не копироваться объект а его ссылка. В итоге в Map будут осодержаться вообще все поддеревья ссылыющееся друг на друга. Можно потом вырвать оттуда объект по ключу id корня и Map удалить.
    Ответ написан
    Комментировать