function merge(nums1, m, nums2, n) {
for (let i = m + n, i1 = m - 1, i2 = n - 1; i--;) {
nums1[i] = i2 < 0 || nums1[i1] > nums2[i2] ? nums1[i1--] : nums2[i2--];
}
}
function randomCall(items) {
const max = items.reduce((acc, n) => acc + n.ratio, 0);
return function(...args) {
const val = Math.random() * max;
for (let sum = 0, i = 0; i < items.length; i++) {
sum += items[i].ratio;
if (sum > val) {
return items[i].func.apply(this, args);
}
}
};
}const func = randomCall([
{ func: func1, ratio: 1 },
{ func: func2, ratio: 2 },
{ func: func3, ratio: 3 },
{ func: func4, ratio: 4 },
]);
const value = 'myValue';.// если речь идёт о каком-то конкретном свойстве
const hasValue = x => x && x.value === value;
// если имя свойства не важно
const hasValue = x => Object.values(x || {}).includes(value);const find = (data, test) =>
test(data)
? data
: data === Object(data)
? Object.values(data).reduce((found, n) =>
found !== null ? found : find(n, test)
, null)
: null;function find(data, test) {
for (const stack = [ data ]; stack.length;) {
const n = stack.pop();
if (test(n)) {
return n;
} else if (n instanceof Object) {
stack.push(...Object.values(n).reverse());
}
}
return null;
}const obj = find(arrayData, hasValue);.
.item, а не вложенные в него элементы:.item[data-xxx="1"]::before { background: #444; }
.item[data-xxx="2"]::before { background: #555; }
.item[data-xxx="3"]::before { background: #666; }
.item[data-xxx="4"]::before { background: #777; }
.item[data-xxx="5"]::before { background: #888; }
.item[data-xxx="6"]::before { background: #999; }.item не надо:$('#counter').on('input', e => {
$('#results').html('<div class="item"></div>'.repeat(e.target.value));
}).trigger('input');
// или
const results = document.querySelector('#results');
const counter = document.querySelector('#counter');
counter.addEventListener('input', ({ target: { value } }) => {
results.innerHTML = Array(++value).join('<div class="item"></div>');
});
counter.dispatchEvent(new Event('input'));$('#view').on('click', () => $('.item').attr('data-xxx', () => 1 + Math.random() * 6 | 0));
// или
document.querySelector('#view').addEventListener('click', () => {
document.querySelectorAll('.item').forEach(n => n.dataset.xxx = -~(Math.random() * 6));
});
document.querySelector('table').addEventListener('click', ({ target: t }) => {
const next = t.matches('input[type="button"]') && t.parentNode.nextElementSibling;
const input = next && next.querySelector('input');
input && (input.type = 'text');
});
state = {
opened: null,
}
toggle = ({ target: { dataset: { name } } }) => {
this.setState(({ opened }) => ({
opened: opened === name ? null : name,
}));
}
Object.fromEntries((url.match(/(?<=utm_).+?=[^&]*/g) || []).map(n => n.split('=')))[...url.matchAll(/utm_([^=]+)=([^&]*)/g)].reduce((acc, [ , k, v ]) => (acc[k] = v, acc), {})Array
.from(new URL(url).searchParams)
.filter(n => n[0].startsWith('utm_'))
.reduce((acc, n) => ({ ...acc, [n[0].slice(4)]: n[1] }), {})
select.value = '0';select.selectedIndex = 0;true в качестве значения свойства selected тому option'у, на который хотите переключиться:select[0].selected = true;
// или
select.options[0].selected = true;
// или
select.children[0].selected = true;
// или
select.firstElementChild.selected = true;
// или
select.querySelector('[selected]').selected = true;select.innerHTML += '';
Не дублируя код инициализации
const disableByType = (elements, type) =>
elements.forEach(n => n.disabled = n.dataset.type2 !== type);// можно сделать делегированный обработчик
document.addEventListener('change', ({ target: { dataset: { type1 } } }) => {
if (type1) {
disableByType(document.querySelectorAll('[data-type2]'), type1);
}
});
// или, назначить обработчик каждой радиокнопке индивидуально
const radios1 = document.querySelectorAll('[data-type1]');
const radios2 = document.querySelectorAll('[data-type2]');
const onChange = e => disableByType(radios2, e.target.dataset.type1);
radios1.forEach(n => n.addEventListener('change', onChange));
{{ массивВозможныхЗначений[индексЗначения] }}следующееЗначение = массивВозможныхЗначений[массивВозможныхЗначений.indexOf(текущееЗначение) + 1]
const entries = Object.entries(obj);
const mustBeRemoved = v =>
(v instanceof Object && !Object.keys(v).length) ||
(!v && typeof v !== 'boolean');const newObj = Object.fromEntries(entries.filter(n => !mustBeRemoved(n[1])));entries.forEach(n => mustBeRemoved(n[1]) && delete obj[n[0]]);
function createTree($data, $levelKey, $childrenKey) {
$tree = [];
foreach ($data as $n) {
$arr = &$tree;
for ($level = $data[0][$levelKey]; $n[$levelKey] > $level; $level++) {
$arr = &$arr[count($arr) - 1][$childrenKey];
}
$arr[] = $n + [ $childrenKey => [] ];
}
return $tree;
}
$tree = createTree($arr, 'depth', 'children');function createTree($data, $params = []) {
$levelKey = $params['levelKey'] ?? 'level';
$childrenKey = $params['childrenKey'] ?? 'children';
$root = [];
$parents = [ $data[0][$levelKey] => &$root ];
foreach ($data as $n) {
$n[$childrenKey] = [];
$level = $n[$levelKey];
$p = &$parents[$level];
$p[] = $n;
$parents[-~$level] = &$p[~-count($p)][$childrenKey];
}
return $root;
}
$tree = createTree($arr, [ 'levelKey' => 'depth' ]);
const source = document.querySelector('.box1').children;
const target = document.querySelector('.box2');target.firstElementChild.insertAdjacentHTML('afterend', Array
.from(source, ({ innerText: n }) => `<p><a href="#${n}">${n}</a></p>`)
.join('')
);target.children[0].after(...Array.prototype.map.call(source, n => {
const p = document.createElement('p');
p.append(document.createElement('a'));
p.lastChild.href = '#' + n.textContent;
p.lastChild.text = n.textContent;
return p;
}));
preg_match('\/\/.+\?', $embed, $matches);echo $matches;$matches[0]
<div class="wrapper">
<button data-view="horizontal">Горизонтально</button>
<button data-view="vertical">Вертикально</button>
<div class="card-wrapper" data-view="horizontal">
<div class="card"></div>
<div class="card"></div>
<div class="card"></div>
<div class="card"></div>
</div>
</div>.card-wrapper {
display: flex;
}
.card-wrapper[data-view="horizontal"] {
flex-direction: row;
}
.card-wrapper[data-view="vertical"] {
flex-direction: column;
}document.querySelector('.wrapper').addEventListener('click', function(e) {
const view = e.target.dataset.view;
if (view && e.target.tagName === 'BUTTON') {
this.querySelector('.card-wrapper').dataset.view = view;
}
});<div class="wrapper">
<button data-view="horizontal">Горизонтально</button>
<button data-view="vertical">Вертикально</button>
<div class="card-wrapper active" data-view="horizontal">
<div class="card"></div>
<div class="card"></div>
<div class="card"></div>
<div class="card"></div>
</div>
<div class="card-wrapper" data-view="vertical">
<div class="card"></div>
<div class="card"></div>
<div class="card"></div>
<div class="card"></div>
</div>
</div>.card-wrapper {
display: none;
}
.card-wrapper.active {
display: flex;
}
.card-wrapper[data-view="horizontal"] {
flex-direction: row;
}
.card-wrapper[data-view="vertical"] {
flex-direction: column;
}document.querySelector('.wrapper').addEventListener('click', function(e) {
const view = e.target.dataset.view;
if (view && e.target.tagName === 'BUTTON') {
document.querySelectorAll('.card-wrapper').forEach(n => {
n.classList.toggle('active', n.dataset.view === view);
});
}
});