Задать вопрос
  • Как в react передавать фокус от 1 инпута к другому?

    @dimoff66
    Кратко о себе: Я есть
    При рендеринге:
    <input 
      ref={someConditionIsTrue ? (input) => { this.focusedInput = input } : null} 
      ...        
    />


    и

    componentDidMount(){
      this.focusedInput && this.focusedInput.focus();
    }
    Ответ написан
    Комментировать
  • Как правильно сравнить десятичные числа в JS?

    @dimoff66
    Кратко о себе: Я есть
    Определяем количество знаков после запятой и разницу между числами умножаем
    и округляем до целого (все эти операции, чтобы избавиться от js-ных неточностей)
    Если целое не больше единицы, значит равно.

    Если количество знаков после запятой определяется по первому переданному числу, то код следующий

    const compare= (v, v2) => {
       const parts = String(v).split('.')
       const pow = parts.length > 1 ? parts.pop().length : 0     
       return Math.round(Math.abs(v - v2) * Math.pow(10, pow)) <= 1
    }
    
    console.log(compare(7.98, 7.99)) // true
    console.log(compare(7.98, 7.97)) // true
    console.log(compare(7.98, 8)) // false
    console.log(compare(0.1, 0.15)) // true


    если по числу с наибольшим количеством знаков после запятой, то такой

    const compare= (v, v2) => {
       const parts = [v, v2].map(v => String(v).split('.'))
       const pow = Math.max(...parts.map(v => v.length > 1 ? v.pop().length : 0))
       return Math.round(Math.abs(v - v2) * Math.pow(10, pow)) <= 1
    }
    
    console.log(compare(7.98, 7.99)) // true
    console.log(compare(7.98, 7.97)) // true
    console.log(compare(7.98, 8)) // false
    console.log(compare(0.1, 0.15)) // false
    Ответ написан
    4 комментария
  • Как получить всех родителя и родителей родителя?

    @dimoff66
    Кратко о себе: Я есть
    function convertToTree (elems, idField, parentIdField) {
        const tree = []
        const elemsMap = {}
    
        elems.forEach(item => { 
          elemsMap[item[idField]] = {
            ...item, 
            parent: null, 
            children: [] 
          } 
        })
    
        for(let id in elemsMap) {
          const item = elemsMap[id]
          if (!item[parentIdField]) {
            tree.push(item)
          } else {
            const parent = elemsMap[item[parentIdField]]
            parent.children.push(item)
            item.parent = parent
          }
        }
        
        return tree
      }
    
    const tree = convertToTree(yourArray, 'structureId', 'parentId')
    Ответ написан
    Комментировать
  • Как отфильтровать по инпутам-чекбоксам массив элементов с помощью метода filter?

    @dimoff66
    Кратко о себе: Я есть
    В вашем конкретном случае сам массив фильтровать вроде и незачем, раз его значения в точности совпадают со значениями инпутов, просто делаете селекторный запрос

    var arr = [
    	{ country: 'Italy', capital: "rome"},
      { country: 'usa', capital: 'Washington'},
      { country: 'france', capital: 'Paris'},
      { country: 'spain', capital: 'Madrid'},
    ]
    
    const onClick = () => {
    	const countriesChecked = Array.from(document.querySelectorAll('.btn') )
        .filter(item => item.checked)
        .map(item => item.value)
        
      const cities = arr
      	.filter(elem => countriesChecked.includes(elem.country))
        .map(elem => elem.capital)  
        
        alert(cities)
    }
    
    [...document.querySelectorAll('.btn')].forEach(item => {
    	item.addEventListener('click', onClick)
    })
    Ответ написан
    7 комментариев
  • Выборка товаров в диапазоне цен с галочками акции?

    @dimoff66
    Кратко о себе: Я есть
    Проверьте скобки в данной конструкции
    visible (elem, checkPrice(min, max, res)) && (elem, checkSale(elem))
    Ответ написан
  • Как лучше организовать стейт каталога с раскрывающимися списками?

    @dimoff66
    Кратко о себе: Я есть
    1. Жестокий хардкодинг.

    subtopicList1: false,
    subtopicList2: false,


    Что там в пропущенных частях кода даже сложно представить. JSX тоже похоже выводится для каждой темы отдельно. Лучше все повторяющиеся части делать в цикле

    2. Вместо
    data-subtopic-list="subtopicList1"
     onClick={handleTopicClick}


    лучше просто написать
    onClick={e => { e.preventDefault(); handleTopicClick('subtopicList1'); }}

    и
    const handleTopicClick = subtopicList => {
      setSubtopicLists({
        ...subtopicLists,
        ...{ [subTopicList]: !subtopicLists[subTopicList] }
      });
    };
    Ответ написан
    7 комментариев
  • Не понимаю условия условия задачи. Что необходимо сделать?

    @dimoff66
    Кратко о себе: Я есть
    module.exports = function (start, end, fetchFlights) {
        let fetchPromise, route
        
        const routes = [[start]]
        const last = arr => arr[arr.length - 1]
    
        // функция обработки ответа
        const responseExecution = response => {
          let result
          // Если респонс включает конечную точку, 
          // то составляем маршрут из последних элементов routes
          if (response.includes(end)) {
            route = [...routes.map(list => last(list)), end]
          } else if (response.length) {
            // если респонс содержит города, добавляем его в конец списка
            routes.push(response)
          } else { // если массив пустой
            // если это был последний город на текущем уровне графа
            // удаляем весь уровень и т.д. в цикле
            while (routes.length && last(routes).length === 1) {
              routes.pop()
            }
            // если массив routes опустел, значит вариантов нет
            if (!routes.length) {
              route = 'no way'
            } else { // удаляем последний город последнего уровня
              last(routes).pop()
            }
          }
    
          // если маршрут еще не определен, добавляем then и запрашиваем
          // полеты для последнего города последнего уровня
          if (!route) {
            fetchPromise = fetchPromise.then(responseExecution)
            return fetchFlights(last(last(routes)))
          }
        }
    
        // стартуем промис получения полетов
        fetchPromise = fetchFlights(start).then(responseExecution)
    
        // Возвращаем промис, в котором запускаем интервал и резолвим,
        // когда route не пустой
        return new Promise((resolve, reject) => {
          const id = setInterval(() => {
            if (route) {
              clearInterval(id)
              resolve(route)
            }
          }, 1000)
        })
      }


    fetchFlights для проверки

    const fetchFlights = city => {
        const flights = [
          ['A', 'B'],
          ['A', 'C'],
          ['A', 'D'],
          ['D', 'K'],
          ['D', 'L'],
          ['D', 'M'],
          ['M', 'Q'],
          ['M', 'Z'],
          ['L', 'G'],
          ['L', 'F'],
          ['F', 'Y']
        ]
    
        return Promise.resolve(flights.filter(item => item[0] === city).map(item => item[1]))
      }
    Ответ написан
  • Почему не работает код с циклом forEach?

    @dimoff66
    Кратко о себе: Я есть
    Array.from(images).forEach

    так как Images - HTML коллекция, а не массив, а у HTML коллекций нет метода forEach
    Ответ написан
    Комментировать
  • Как добавить пробел (между тысячами) в строке input?

    @dimoff66
    Кратко о себе: Я есть
    1) Перед проверкой паттерна тоже удалите из него пробел, будет давать ввести больше 4 цифр
    if (!(value..replace(/\s/g, '').match(pattern))

    onkeyup перепишите в виде
    document.getElementById('input').onkeyup = function() {
      val_input = document.getElementById('input').value;
      val_input = val_input.replace(/\s/g, '');
    
      if (!val_input) return;
      var hasDotAtTheEnd = val_input.endsWith('.');
      
      val_input = Number.parseFloat(val_input)
      if (isNaN(val_input)) return  
      
      document.getElementById('input').value = val_input.toLocaleString('ru').replace(',', '.') + (hasDotAtTheEnd ? '.' : '');
    }
    Ответ написан
  • Как не отображать таблицу если в ней нет столбцов на JQuery или JS?

    @dimoff66
    Кратко о себе: Я есть
    Поставить этот код в тэг "script" перед закрывающим тэгом body

    const table = document.querySelector("#news")
    if (!table.querySelector("tbody tr")) {
      table.style.display = "none"
    } else {
      table.style.display = ""
    }
    Ответ написан
    Комментировать
  • Почему при добавлении в базу шестнадцать единиц превращаются в 1.111111111111111e15?

    @dimoff66
    Кратко о себе: Я есть
    Если тип поля строковой тогда ваша озабоченность понятна, действительно ввел одно, а отображается другое, если же числовой, то то что вы видите - всего лишь представление числа и "исправлять" его нужно там, куда вы его выводите.
    Ответ написан
    Комментировать
  • Как организовать MVC на клиенте?

    @dimoff66
    Кратко о себе: Я есть
    Все примерно так, контроллером в данном случае является сервер
    Можно конечно назвать единицу данных, получаемых с сервера моделью, но если вы ничего с ней не делаете, а лишь держите в состоянии и выводите во вьюшщку, то назвать ее можно хоть соленым огурцом.

    Другое дело, что если на клиенте с ней сотворяется CRUD и при сотворении CRUD-а применяется какая-то логика, то да, появляются модель и контроллер. (например список работников, который выводится, создается новый работник и редактируются существующие)
    Ответ написан
    Комментировать
  • Боюсь идти на работу. Было ли на вышей практике что брали джуна, а он не справлялся? сразу увольняют?

    @dimoff66
    Кратко о себе: Я есть
    Идите на зарплату поменьше, там меньше требований и меньше напряжения, а как освоитесь и увидите, что тупите не только вы но и 70% коллектива от миддла до сеньора, попросите прибавки.
    Ответ написан
    1 комментарий
  • Какой самый быстрый алгоритм поиска максимального значения в большом файле?

    @dimoff66
    Кратко о себе: Я есть
    Основная оптимизация при условии что числа могут быть любого размера - считывать размерность чисел, сохраняя в массив числа с наибольшей на данный момент или считывать их позиции если файл доступен для чтения полностью а не последовательно. Как только найдется число большей разрядности все прочие ранее сохраненные данные можно обнулить без сравнения.

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

    @dimoff66
    Кратко о себе: Я есть
    Для каждого тэга в спецификации html 5 определён список допустимых атрибутов, для div это скорее всего id, class, style и события.. Всё прочие данные, которые вы хотите в нем хранить предлагается хранить в dataset, то есть атрибутах, начинающихся с data-, в вашем случае data-content
    Ответ написан
  • Стратегия хранения заказов?

    @dimoff66
    Кратко о себе: Я есть
    Тут вряд ли можно развести холливар. У заказа должен быть таймстемп и у записи изменения цены должен быть таймстемп, соответственно цена для заказа должна быть равна самой поздней записи установки цены со временем меньшим чем время заказа.

    То есть price должен быть не в product (хотя там можно оставить, чтобы получить актуальную цену на текущий момент), а в таблице prices (timestamp, product_id, price) индексированной по двум первым колонкам.
    Ответ написан
    Комментировать
  • Как найти арифметическую прогрессию в списке?

    @dimoff66
    Кратко о себе: Я есть
    Интервал известен заранее? Если нет, то сколько чисел будут считаться прогрессией? больше 2?

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

    Например для последовательности 8, 4, 12, 7, 3
    Получаем отсортированный массив 3, 4, 7, 8, 12
    Для 3ки ничего не находим
    Для 4ки проверяем 7: 7 * 2 - 4 = 10 (10 не найдено)
    Для 4ки проверяем 8: 8 * 2 - 4 = 12 (12 есть, значит последовательность найдена)
    Ответ написан
    4 комментария
  • Фриланс недобросовестный заказчик не заплатил за работу, что делать?

    @dimoff66
    Кратко о себе: Я есть
    18 часов ничто, это 150 долларов при вашей почасовке. Смешная сумма. Люди, я в частности, теряли куда больше в аналогичных ситуациях. Нет никаких проблем. Просто примите, что шит хеппенс, что бог все видит, что все возвращается бумерангом, и вы тоже когда-нибудь кому-нибудь не доплатите(шутка). Если серьезно: где-то теряешь, где-то находишь, мне бывало переплачивали на ровном месте, так что все окей. Время которое вы потратите на суды с неясным итогом, лучше потратить на заработок
    Ответ написан
    Комментировать
  • Как заменить цвет фона блока по нажатию на него?

    @dimoff66
    Кратко о себе: Я есть
    const blocks = document.querySelectorAll('.block')
    const colors = ['grey', 'red', 'green', 'transparent']
    
    blocks.forEach((el, ind) => {
      el.addEventListener('click', () => {
        let currentColor = el.dataset.colorIndex
        if (isNaN(currentColor)) currentColor = -1
    
        let nextColor = 1 + Number(currentColor)
        if (nextColor === colors.length) nextColor = 0
        el.dataset.colorIndex = nextColor
    
        el.style.background = colors[nextColor]
    })
    Ответ написан
  • Оценить простое задание на react?

    @dimoff66
    Кратко о себе: Я есть
    Filters также можно реорганизовать элегантней. Во-первых вывести все фильтры в цикле, чтобы не плодить кода

    const allFilters = [
      { id: 'all', title: 'Все' },
      { id: 'noStop', title: 'Без пересадок' },
      { id: 'oneStop', title: '1 пересадка' },
      // и т.д.
    ]
    
    return <div className="filters">
      <h3 className="filters__title"> Количество пересадок </h3>
      {allFilters.map(({id, title}) => (
        <div className="filters__item" key={id}>
          <input type="checkbox" id={id} hidden
                 defaultChecked={props.sortStops[id]}
          />
          <label htmlFor={id} onClick={() => props.onClick(id)}>
            {title}
          </label>
        </div>)
      )}
    </div>


    Во вторых обратите внимание вместо
    onClick={props.onClick}

    можно сразу передать id в функцию-обработчик, а не выковыривать ее через e.target
    onClick={() => props.onClick(id)}

    И обработчик нажатия тогда будет выглядеть
    const onClickStops = chosenOption => {
      // обработчик нажатия на фильтры выбора количества остановок
      setSortStops({
        ...sortStops,
        chosenOption: !sortStops[chosenOption]
      })
    }
    Ответ написан
    Комментировать