document.getElementById("target").dispatchEvent(new Event('keydown', { which: event.which }));
const target = document.getElementById("target")
target.focus()
target.selectionStart = target.innerText.length
target.dispatchEvent(
new Event('keydown', { which: event.which })
target.innerText += event.key
class MyClass {
method1 () { alert(1) }
method2 () { alert(2) }
}
const obj = new MyClass
obj.method3 = () => { alert(3) }
console.log(obj.hasOwnProperty('method2'))
// false, потому что это свойство родителя, не собственное
console.log(obj.hasOwnProperty('method3'))
// true, потому что это свойство не унаследовано а добавлено непосредственно к объекту
console.log(Boolean(obj.__proto__.method2))
// true, проверяется в наследованном от непосредственного родителя прототипе
console.log(Boolean(obj.method2))
// true, проверяется во всей цепочке прототипов, при длинной цепочке наследования может быть неоправданно затратной операцией
var img = document.getElementById('rotateImg');
var img = document.getElementById('rotateImg2');
Когда мне надо написать regexp я захожу на regex101
function replaceSubstring(string, words, substring) {
// Получаем слова между которыми искать замену
const [word1, word2] = words.split(' ')
// Находим индексы этих слов
const [pos1, pos2] = [string.indexOf(word1), string.indexOf(word2)]
if (pos1 < 0 || pos1 + word1.length >= pos2) return string
// Добавляем пробелы в строку замены, если отсутствуют
if (!substring.startsWith(' ')) substring = ' ' + substring
if (!substring.endsWith(' ')) substring += ' '
// Возвращаем новую стрроку с итерационным вызовом, так как могут быть и другие вхождения
return string.substring(0, pos1 + word1.length) +
substring +
word2 +
replaceSubstring(string.substring(pos2 + word2.length), words, substring)
}
function replaceSubstring2(string, words, substring) {
if (!substring.startsWith(' ')) substring = ' ' + substring
if (!substring.endsWith(' ')) substring += ' '
const regex = words.replace(' ', '.+?')
return string.replaceAll(new RegExp(regex, 'g'), words.replace(' ', substring))
}
function nextSmaller(n){
const rev = [...`${n}`].map(Number).reverse()
const idx1 = rev.findIndex((v, i, a) => i && a[i-1] < v)
if (idx1 < 0) return idx1
const idx2 = rev.slice(0, idx1).findIndex(v => v < rev[idx1])
if (idx2 < 0) return idx2;
[rev[idx1], rev[idx2]] = [rev[idx2], rev[idx1]]
const nn = +rev.slice(idx1).reverse().concat(rev.slice(0, idx1)).join('')
return nn
}
console.log(nextSmaller(133232766512347)) //133232766475321
function getSortBy(arr, rules = ['10', '110', 220]) {
const groupedMap = arr.reduce((agg, v) => {
if (!agg[v.groupId]) agg[v.groupId] = []
agg[v.groupId].push(v)
return agg
}, {})
const groups = Object
.values(groupedMap)
.map(arr => arr.sort((a, b) => b.source - a.source))
const indexedGroups =
groups
.map(arr => ({
arr,
sortIndex: (rules.indexOf(arr.map(v => v.source).join('')) + 1) || 1000
}))
const sortedGroups =
indexedGroups.sort((a, b) => a.sortIndex - b.sortIndex)
const firstGroup = sortedGroups[0].arr
const element = firstGroup.find(v => v.source === 0)
return element
}
const arr = [
{id: 1, groupId: 100, source: 1},
{id: 2, groupId: 100, source: 2},
{id: 3, groupId: 100, source: 1},
{id: 4, groupId: 200, source: 1},
{id: 5, groupId: 200, source: 0},
{id: 6, groupId: 300, source: 1},
{id: 7, groupId: 300, source: 0},
{id: 8, groupId: 300, source: 1},
{id: 9, groupId: 400, source: 1},
{id: 10, groupId: 400, source: 0},
{id: 11, groupId: 400, source: 0},
{id: 12, groupId: 500, source: 2},
{id: 13, groupId: 500, source: 1},
];
console.log(getSortBy(arr)) // { groupId: 200, id: 5, source: 0 }
const arr2 = [
{id: 1, groupId: 100, source: 1},
{id: 2, groupId: 100, source: 2},
{id: 3, groupId: 100, source: 1},
{id: 4, groupId: 200, source: 1},
{id: 5, groupId: 200, source: 2},
{id: 6, groupId: 300, source: 1},
{id: 7, groupId: 300, source: 0},
{id: 8, groupId: 300, source: 1},
{id: 9, groupId: 400, source: 1},
{id: 10, groupId: 400, source: 2},
{id: 11, groupId: 400, source: 2},
{id: 12, groupId: 500, source: 2},
{id: 13, groupId: 500, source: 1},
];
console.log(getSortBy(arr2)) // { groupId: 300, id: 7, source: 0 }
let customKeys
const items = Array.from(['custom', 'default']).flatMap(group => {
const scope = group + "Data"
// Собираем элементы группы
const items = (data[group] || []).flatMap(({ id, links }) =>
links.map(link => ({...link, id, scope }))
)
const getKey = v => JSON.stringify([v.id, v.number])
if (!customKeys) {
// индексируем ключи кастомных элементов
customKeys = items.reduce((agg, v) =>
Object.assign(agg, {[getKey(v)]: v})
, {})
return items
} else {
// Для ключей, найденных ранее, устанавливаем родителя и отфильтровываем
const defaultIds = []
const defaultItems = items.filter(v => {
const child = customKeys[getKey(v)]
if (child) {
child.parent = v
defaultIds.push(v.id)
} else {
return true
}
})
// Оставляем в data.default лишь элементы с id, не найденные в custom
if (defaultIds.length) {
const idsSet = new Set(defaultIds)
const copy = [...data.default]
data.default.length = 0
data.default.push(...copy.filter(v => !idsSet.has(v.id)))
}
return defaultItems
}
})
console.log(data) // Дата без кастомных ключей в дефолт скоуп
console.log(items) // Результат
const data = [
"Пн 02:15 - Пн 07:40",
"Пн 04:20 - Пн 06:00",
"Пн 06:30 - Пн 09:15",
"Пн 09:50 - Пн 15:00",
"Пн 17:00 - Вт 23:20"];
const weekDays = ["Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"]
const periods = data
.map(v =>
v
.split(" - ")
.map(v =>
String(weekDays.indexOf(v.substring(0, 2))) +
v.substring(2)
)
)
.sort((a, b) => {
if (a[0] < b[0]) return -1
if (a[0] > b[0]) return 1
return 0
})
.concat([["6 23:59", ""]])
const freePeriods = periods.reduce((agg, period) => {
if (period[0] > agg.lastOccupied) agg.freePeriods.push([agg.lastOccupied, period[0]])
if (agg.lastOccupied < period[1]) agg.lastOccupied = period[1]
return agg
}, { freePeriods: [], lastOccupied: "0 00:00"} )
.freePeriods
.map(v =>
v.map(v => weekDays[v[0]] + v.substring(1)).join(" - ")
)
console.log(freePeriods) // ["Пн 00:00 - Пн 02:15", "Пн 09:15 - Пн 09:50", "Пн 15:00 - Пн 17:00", "Вт 23:20 - Вс 23:59"]
Как синхронный однопоточный язык вообще может асинхронно выполнять задачи ?
function fetchMe() {
fetch("/api/get").then(response => console.log("Сервер ответил " + response))
console.log("Ждем ответа сервера")
}