str.slice(1).split('&').reduce((acc, n) => (n = n.split('='), acc[n[0]] = n[1], acc), {})
// или
[...str.matchAll(/(\w+)=([^&]*)/g)].reduce((acc, [ , k, v ]) => ({ ...acc, [k]: v }), {})
// или
Object.fromEntries(new URLSearchParams(str))
const STAGES = {
2: 'itemGv',
5: 'itemTm',
};for (const [ key, val ] of Object.entries(items)) {
const s = STAGES[val.stage];
if (s) {
this.client.srem('items', key);
this.emit(s, val);
}
}
li(class=list.class)= list.descli(class=item.class)= item.desc
const XXX = length => Array
.from({ length }, (n, i) => Array
.from({ length: i + 1 }, (n, i) => i + 1)
.join(','))
.join('\n');
console.log(XXX(5));const XXX = length => Array
.from({ length }, function() {
this.push(-~this.length);
return this.join`,`;
}, [])
.join`\n`;const XXX = length => Array
.from({ length }, (n, i) => Array
.from(Array(++i).keys())
.reduce((acc, n) => acc + (acc && ',') + ++n, ''))
.reduce((acc, n) => acc + (acc && '\n') + n, '');
const SKILLS = {
sport: [ 'running', 'squats', 'snowboarding' ],
music: [ 'guitar', 'drums' ],
};
const filterBySkill = (people, filter) =>
people.filter(({ skills }) =>
skills.every(n => filter.some(m => SKILLS[m].includes(n))) &&
filter.every(n => skills.some(m => SKILLS[n].includes(m)))
);
<div id="time"></div>function setTimer(el, template) {
return setInterval(el => {
const d = new Date();
const timeData = Object.fromEntries([
[ 'h', 'getHours' ],
[ 'm', 'getMinutes' ],
[ 's', 'getSeconds' ],
].map(n => [ n[0], `${d[n[1]]()}`.padStart(2, 0) ]));
el.innerHTML = template.replace(
/\$(\w)/g,
(m, g1) => timeData.hasOwnProperty(g1) ? timeData[g1] : m
);
}, 1000, typeof el === 'string' ? document.querySelector(el) : el);
}
const intervalId = setTimer('#time', '<strong>Сейчас</strong> $h:$m:$s');
Начал задумываться о выборе фреймворка после изучения основ
function sortChildren(el, key) {
el.append(...Array
.from(el.children, n => [ n, key(n) ])
.sort((a, b) => a[1] - b[1])
.map(n => n[0])
);
}
sortChildren(document.querySelector('.menu'), n => +n.dataset.num);
getElementsByTagName возвращает динамическую коллекцию элементов, т.е. такую, которая автоматически обновляется при добавлении/удалении элементов. Поэтому сейчас у вас происходит следующее: удалили элемент с индексом 0, и у всех остальных элементов изменился индекс на единицу вниз, 0 вместо 1, 1 вместо 2 и т.д. При этом счётчик цикла вы на единицу увеличили, так что на следующей итерации удаляете элемент с индексом 1 - бывший 2. А тот, который был 1 и стал 0 - его вы пропускаете. А после следующего удаления пропускаете ещё один. Ну и т.д. Каждый второй.document.getElementsByTagName("p") на document.querySelectorAll('p'), так вы получите статическую коллекцию элементов.allP от конца к началу:for (let i = allP.length; i--;) {
body.removeChild(allP[i]);
}while (allP.length) {
allP[0].remove();
}body по id - безумие, этот элемент существует в единственном экземпляре и ссылка на него доступна как свойство объекта document. Так что id уберите и замените document.getElementById("body") на document.body.
как улучшить мой код
function fearNotLetter(str) {
const missing = Array
.from(str, n => n.charCodeAt(0))
.find((n, i, a) => n !== a[0] + i);
return missing && String.fromCharCode(missing - 1);
}function fearNotLetter(str) {
for (let i = 0, code = str.charCodeAt(0); ++i < str.length;) {
if (str.charCodeAt(i) !== ++code) {
return String.fromCharCode(code);
}
}
}
getCitiesOptions = () => {
const country = +this.state.country;
return Object
.entries(cities)
.filter(n => n[1].country === country)
.map(([ id, city ]) => <option key={id} value={id}>{city.name}</option>);
}