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);
}
}
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);
}
Array.prototype.unique = function() {
this.splice(0, this.length, ...new Set(this));
return this;
};
Array.prototype.unique = function(key = n => n) {
const getKey = key instanceof Function ? key : n => n[key];
let numDeleted = 0;
this.forEach(function(n, i, a) {
a[i - numDeleted] = n;
const k = getKey(n);
numDeleted += this.has(k) || !this.add(k);
}, new Set);
this.length -= numDeleted;
return this;
};
[ 1, 1, 1, 2 ].unique() // [1, 2]
[ { id: 3 }, { id: 1 }, { id: 1 }, { id: 3 } ].unique('id') // [{id: 3}, {id: 1}]
[ 'a', 'b', 'c', 'd', 'ab', 'bc' ].unique(n => n.length) // ['a', 'ab']
function translatePigLatin(str) {
const x = str.search(/[aioue]/);
return x > 0
? `${str.slice(x)}${str.slice(0, x)}ay`
: `${str}${x ? '' : 'w'}ay`;
}
function myReplace(str, before, after) {
if (before[0].toUpperCase() === before[0]) {
after = after[0].toUpperCase() + after.slice(1);
}
return str.replace(before, after);
}
const sumNested = (data, getVal, key) => Object
.entries(data instanceof Object ? data : {})
.reduce((acc, [ k, v ]) => acc + sumNested(v, getVal, k), getVal(key, data));
const numItems = sumNested(obj, (k, v) => (k === 'items' && Array.isArray(v)) ? v.length : 0);
function sumNested(data, getVal) {
let result = 0;
for (const stack = [ [ , data ] ]; stack.length;) {
const [ k, v ] = stack.pop();
stack.push(...(v instanceof Object ? Object.entries(v) : []));
result += getVal(k, v);
}
return result;
}
final_data.reduce((acc1, num1) => acc1.reduce((acc2, num2) => acc2.concat(num1.map(num3 => [].concat(num2, num3))), []))
final_data.reduce((acc1, num1) => {
return acc1.reduce((acc2, num2) => {
acc2.push(...num1.map(num3 => [...num2, ...num3]));
return acc2;
}, [])
})
return final_data.reduce((acc1, num1) =>
acc1.reduce((acc2, num2) => (
acc2.push(...num1.map(num3 => num2 + num3)),
acc2
), [])
).join(',');
const whatIsInAName = (collection, source) =>
collection.filter(function(n) {
return this.every(([ k, v ]) => n[k] === v);
}, Object.entries(source));
const parentSelector = '.wrap';
const wrapperTag = 'div';
const wrapperClass = 'wrap-item';
const wrapSize = 4;
const $items = $(parentSelector).children();
for (let i = 0; i < $items.length; i += wrapSize) {
$items.slice(i, i + wrapSize).wrapAll(`<${wrapperTag} class="${wrapperClass}">`);
}
const parent = document.querySelector(parentSelector);
const items = [...parent.children];
parent.append(...Array.from(
{ length: Math.ceil(items.length / wrapSize) },
(n, i) => {
const wrapper = document.createElement(wrapperTag);
wrapper.classList.add(wrapperClass);
wrapper.append(...items.slice(i * wrapSize, (i + 1) * wrapSize));
return wrapper;
}
));
const text = document.querySelector('#area').value;
const pre = document.querySelector('#pre');
pre.innerHTML = text.replace(/f+/g, '<span>$&</span>');
document.addEventListener('scroll', function() {
document.querySelector('.wrap_portfolio').style.transform = `translateX(${window.scrollY}px)`;
});
const color = 'orange';
const { id } = Object.values(fruits).find(n => n.color === color) || {};