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
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')
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)
})
subtopicList1: false,
subtopicList2: false,
data-subtopic-list="subtopicList1"
onClick={handleTopicClick}
onClick={e => { e.preventDefault(); handleTopicClick('subtopicList1'); }}
const handleTopicClick = subtopicList => {
setSubtopicLists({
...subtopicLists,
...{ [subTopicList]: !subtopicLists[subTopicList] }
});
};
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)
})
}
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]))
}
if (!(value..replace(/\s/g, '').match(pattern))
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 ? '.' : '');
}
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]
})
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}
onClick={() => props.onClick(id)}
const onClickStops = chosenOption => {
// обработчик нажатия на фильтры выбора количества остановок
setSortStops({
...sortStops,
chosenOption: !sortStops[chosenOption]
})
}