#javascript
#javascript
Вопрос:
Предположим, у меня есть массив элементов
const elements = ["div", "p", "a", "span"];
Мне нужен цикл, который будет создавать для меня такие упорядоченные элементы.
<div>
<p>
<a>
<span></span>
</a>
</p>
</div>
К сожалению, я застрял 🙂 Конечно, следующий код не работает.
const div = document.createElement(elements[0]);
for (let i = 0; i < elements.length; i ) {
const el = document.createElement(elements[i]);
el.appendChild(el);
}
Ответ №1:
Вы можете сначала сохранить ссылку на внешний элемент, затем на каждой итерации внутри цикла переназначать текущий внешний элемент:
const elements = ["div", "p", "a", "span"];
const div = document.createElement(elements[0]);
let currentOuter = div;
for (let i = 1; i < elements.length; i ) {
currentOuter = currentOuter.appendChild(document.createElement(elements[i]));
}
console.log(div.outerHTML);
Более элегантным подходом было бы использовать reduceRight
:
const elements = ["div", "p", "a", "span"];
const div = elements.reduceRight((child, tag) => {
const parent = document.createElement(tag);
parent.appendChild(child);
return parent;
}, document.createTextNode(''));
console.log(div.outerHTML);
Комментарии:
1. Большое спасибо! Я видел, что это будет легко, но у меня было некоторое затмение ума 🙂
Ответ №2:
const elementNames = ["div", "p", "a", "span"];
let elements = elementNames.map(elementName => document.createElement(elementName));
elements = elements.map((element, index) => ({
prev: index === 0 ? document.body : elements[index - 1],
next: element
}))
for (let {
prev,
next
} of elements) {
prev.appendChild(next);
}
div {
background: yellow;
padding: 1rem;
}
p {
background: green;
padding: 1rem;
}
a {
background: black;
padding: 1rem;
}
span {
background: blue;
padding: 1rem;
}