function sum(data) {
let result = 0;
for (const stack = [ data ]; stack.length;) {
const n = stack.pop();
stack.push(...(n instanceof Object ? Object.values(n) : []));
result += typeof n === 'number' ? n : 0;
}
return result;
}
<label>
Город:
<select id="city"></select>
</label>
<label>
Линия:
<select id="line"></select>
</label>
<label>
Станция:
<select id="station"></select>
</label>
fetch('https://api.hh.ru/metro/').then(r => r.json()).then(subwayData => {
const city = document.querySelector('#city');
const line = document.querySelector('#line');
const station = document.querySelector('#station');
const getLines = () => subwayData[city.value].lines;
const update = (el, data) => {
el.replaceChildren(...data.map((n, i) => new Option(n.name, i)));
el.dispatchEvent(new Event('change'));
};
city.addEventListener('change', () => update(line, getLines()));
line.addEventListener('change', () => update(station, getLines()[line.value].stations));
update(city, subwayData);
});
выводит не совсем то что мне надо
array.length
надо крутить цикл до array.length - n + 1
.const bullshitChunks = (arr, chunkSize) =>
Array.from(
{ length: arr.length + 1 - chunkSize },
(_, i) => arr.slice(i, i + chunkSize)
);
console.log(bullshitChunks([ 1, 2, 3, 4, 5, 6, 7 ], 4));
console.log(bullshitChunks('abcdefg', 5));
carIds
присутствуют такие значения, которых нет среди id
в cars
?undefined
для вас окей, тогдаconst result = carIds.map(n => cars.find(m => m.id === n));
const result = carIds.map(function(n) {
return this[n] ?? 'такого объекта нет';
}, Object.fromEntries(cars.map(n => [ n.id, n ])));
id
ничего не получать:const carsMap = new Map(cars.map(n => [ n.id, n ]));
const result = carIds.reduce((acc, n) => (
(n = carsMap.get(n)) && acc.push(n),
acc
), []);
const selectors = [ '.addservice', '.addprice' ];
const data = Array.from(
document.querySelectorAll('.addserviceBlock'),
n => selectors.map(m => n.querySelector(m).value)
);
const headers = document.querySelectorAll('section > h2');
const menu = document.querySelector('вам виднее, что тут должно быть');
const className = 'inner__menu anchor-js';
const menuHTML = Array.from(headers, n =>
`<a class="${className}" href="#${n.parentNode.id}">${n.innerText}</a>`
).join('');
// можем добавить новое содержимое, не трогая то, что уже есть
menu.insertAdjacentHTML('beforeend', menuHTML);
// или новый контент перезапишет существующий
menu.innerHTML = menuHTML;
const menuElements = Array.from(headers, n =>
Object.assign(document.createElement('a'), {
className,
href: `#${n.parentNode.id}`,
text: n.textContent,
})
);
// добавляем
menu.append(...menuElements);
// перезаписываем
menu.replaceChildren(...menuElements);
const wrapper = document.createElement('div');
const start = block.querySelector('.start');
for (let el; !(el = start.nextElementSibling).matches('.end'); wrapper.appendChild(el)) ;
start.insertAdjacentElement('afterend', wrapper);
const wrapper = document.createElement('div');
const children = [...block.children];
const iStart = children.findIndex(n => n.classList.contains('start'));
const iEnd = children.findIndex(n => n.classList.contains('end'));
wrapper.append(...children.slice(iStart + 1, iEnd));
children[iStart].after(wrapper);
data.reduce((acc, { unique, id, count, name }) => (
((acc[unique] ??= { count })[id] ??= []).push(name),
acc
), {})
const key = 'TicketNumber';
.const val = str.match(RegExp(`(?<=[?;]${key}=)[^;#]*`))?.[0];
// или
const val = new URL(str.replaceAll(';', '&')).searchParams.get(key);
// или
const val = Object.fromEntries(str
.split('?')
.pop()
.split('#')
.shift()
.split(';')
.map(n => n.split('='))
)[key];
function chunked(str, numChunks) {
const chunkSize = Math.ceil(str.length / numChunks);
return Array.from(
{ length: numChunks },
(_, i) => str.slice(i * chunkSize, (i + 1) * chunkSize)
);
}
неаккуратненько как-то:
chunked('test', 3) // [ "te", "st", "" ]
const chunked = (str, numChunks) =>
Array.from(
{ length: numChunks },
function(_, i) {
return str.slice(this(i), i < ~-numChunks ? this(-~i) : str.length);
},
i => i * (Math.max(1, str.length / numChunks | 0))
);
function chunked(str, numChunks) {
const chunkSize = str.length / numChunks | 0;
const numLooseItems = str.length % numChunks;
const chunkIndex = i => i * chunkSize + Math.min(i, numLooseItems);
return Array.from(
{ length: numChunks },
(_, i) => str.slice(chunkIndex(i), chunkIndex(-~i))
);
}
const newStr = str.replace(/\d.*/, '');
// или
const newStr = str.match(/^\D*/)[0];
// или
const newStr = str.split(/[0-9]/).shift();
// или
const newStr = str.slice(0, str.search(/\d|$/));
// или
const newStr = /[^\d]*/.exec(str).pop();
// или
const newStr = [...str].reduceRight((acc, n) => '0123456789'.includes(n) ? '' : acc + n, '');
const sectionAttribute = element.getAttribute('data-content')
const titles = document.querySelectorAll('[data-title]');
const contents = document.querySelectorAll('[data-content]');
titles.forEach(n => n.addEventListener('click', onClick));
function onClick({ currentTarget: t }) {
titles.forEach(n => n.classList.toggle('active', n === t));
contents.forEach(n => n.hidden = n.dataset.content !== t.dataset.title);
}
function toggle({ classList, dataset: { title } }, active) {
classList.toggle('active', active);
document.querySelector(`[data-content="${title}"]`)?.toggleAttribute('hidden', !active);
}
let active = document.querySelector('.active[data-title]');
document.addEventListener('click', ({ target: t }) =>
(t = t.closest('[data-title]')) &&
(active && toggle(active, false), toggle(active = t, true))
);
Object.values(arr.reduce((acc, { name, ...n }) => (
Object.values(n).find(Array.isArray)?.forEach(({ scores, channel }) =>
scores.forEach(({ score }) =>
(acc[channel]?.score > score) || (acc[channel] = { channel, name, score })
)
),
acc
), {}))
const payload = {
data: Object.fromEntries([
'раз свойство',
'два свойство',
'три свойство',
].map(n => [ n, this[n] ])),
};