const titleCase = str => str
.toLowerCase()
.split(' ')
.map(n => n[0].toUpperCase() + n.slice(1))
.join(' ');
const titleCase = str => str
.toLowerCase()
.replace(/(?<=^| )./g, m => m.toUpperCase());
const titleCase = str => Array
.from(str, (n, i) => n[i && str[i - 1] !== ' ' ? 'toLowerCase' : 'toUpperCase']())
.join``;
('#app') new Vue({ router, store, render: h => h(App) }).$mount
$('.popup-link').magnificPopup({
midClick: true,
type: 'inline',
callbacks: {
open() {
const $slider = $('.slider');
if (!$slider.hasClass('slick-initialized')) {
$slider.slick({
infinite: true,
slidesToShow: 1,
dots: true,
});
}
$slider.slick('slickGoTo', +$(this).attr('index'));
},
},
});
(() => {}) instanceof Object // true
Mixed Content: The page at 'https://jsfiddle.net/' was loaded over HTTPS, but requested an insecure script 'http://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js'. This request has been blocked; the content must be served over HTTPS.
const createTreeFromNestedSet = arr =>
[...arr].sort((a, b) => a.left - b.left).reduce((tree, n) => {
let curr = null;
let next = tree;
while (next) {
curr = next;
next = curr.children.find(c => c.left < n.left && c.right > n.right);
}
curr.children.push({ ...n, children: [] });
return tree;
}, { children: [] }).children[0];
const NestedSetTreeItem = ({ item }) => {
const [ showChildren, setShowChildren ] = React.useState(false);
const onClick = () => setShowChildren(v => !v);
return (
<div className="tree-item">
<span>{item.title}: {item.left} - {item.right}</span>
{item.children.length !== 0 ? (
<React.Fragment>
<button onClick={onClick}>{showChildren ? '-' : '+'}</button>
<div className={showChildren ? '' : 'hidden'}>
{item.children.map(n => <NestedSetTreeItem key={n.id} item={n} />)}
</div>
</React.Fragment>
) : null}
</div>
);
};
const NestedSetTree = ({ data }) => {
const tree = React.useMemo(() => createTreeFromNestedSet(data), [ data ]);
return <NestedSetTreeItem item={tree} />;
};
const data = [
{ title: 'Clothing', left: 1, right: 22 },
{ title: 'Men\'s', left: 2, right: 9 },
{ title: 'Women\'s', left: 10, right: 21 },
{ title: 'Suits', left: 3, right: 8 },
{ title: 'Slacks', left: 4, right: 5 },
{ title: 'Jackets', left: 6, right: 7 },
{ title: 'Dresses', left: 11, right: 16 },
{ title: 'Skirts', left: 17, right: 18 },
{ title: 'Blouses', left: 19, right: 20 },
{ title: 'Evening Gowns', left: 12, right: 13 },
{ title: 'Sun Dresses', left: 14, right: 15 },
].map((n, i) => ({ ...n, id: i + 1 }));
ReactDOM.render(<NestedSetTree data={data} />, document.getElementById('app'));
<div id="app"></div>
const container = document;
const selector = 'input[type="checkbox"]';
const sumElements = elements =>
Array.prototype.reduce.call(elements, (acc, n) => acc + +n.value, 0);
const onSumChange = sum => console.log(sum);
container.addEventListener('change', function({ target: t }) {
if (t.matches(selector)) {
onSumChange(sumElements(this.querySelectorAll(`${selector}:checked`)));
}
});
container.querySelector(selector).dispatchEvent(new Event('change', { bubbles: true }));
const cb = container.querySelectorAll(selector);
let sum = sumElements(Array.prototype.filter.call(cb, n => n.checked));
const onChange = e => onSumChange(sum += e.target.value * [ -1, 1 ][+e.target.checked]);
cb.forEach(n => n.addEventListener('change', onChange));
onSumChange(sum);
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.desc
li(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');