Заголовки и будущее меню:
const headers = document.querySelectorAll('section > h2');
const menu = document.querySelector('что здесь должно быть, понятия не имею, сами разберётесь');
Собираем меню:
menu.innerHTML = Array
.from(headers, n => `<a href="#${n.parentNode.id}">${n.innerHTML}</a>`)
.join('');
или
for (const { parentNode: p, textContent: t } of headers) {
menu.insertAdjacentHTML(
'beforeend',
'<a href="#' + p.getAttribute('id') + '">' + t + '</a>'
);
}
или
menu.append(...Array.prototype.map.call(headers, n => {
const a = document.createElement('a');
a.href = '#'.concat(n.parentNode.attributes.id.value);
a.innerText = n.innerText;
return a;
}));
или
headers.forEach(({ parentNode: { outerHTML } }) => {
const a = document.createElement('a');
a.setAttribute('href', outerHTML.match(/id="(.*?)"/).pop().replace(/^/, '#'));
a.appendChild(document.createTextNode(outerHTML.match(/h2>(.*)<\/h2/)[1]));
menu.insertAdjacentElement('beforeend', a);
});