let wrap = document.querySelector(".wrap");
let temp = document.querySelector(".temp");
temp.addEventListener("click", (event) => {
// returns pragraph of children[0]. Works fine.
console.info(wrap.children[0].firstElementChild);
// returns list of all lis, not pragraphs.
let filtered = Array.from(wrap.children).filter(item => item.firstElementChild);
console.info(filtered);
})
<div>
<ul class = "wrap">
<li>
<p class = "temp">outer 1</p>
<ul>
<li>inset 1</li>
</ul>
</li>
<li>
<p>outer 2</p>
<ul>
<li>inset 1</li>
</ul>
</li>
<li>
<p>outer 3</p>
<ul>
<li>inset 1</li>
</ul>
</li>
<li>
<p>outer 4</p>
<ul>
<li>inset 1</li>
</ul>
</li>
<li>
<p>outer 5</p>
<ul>
<li>inset 1</li>
</ul>
</li>
<li>
<p>outer 6</p>
<ul>
<li>inset 1</li>
</ul>
</li>
<li>
<p>outer 7</p>
<ul>
<li>inset 1</li>
</ul>
</li>
</ul>
</div>
Я хочу перегруппировать все p
каждого из li
с помощью метода filter
, но функция продолжает работать странно.
// returns pragraph of children[0]. Works fine.
console.info(wrap.children[0].firstElementChild);
Проверка одного абзаца с помощью .firstElementChild
работает просто отлично. Однако, когда я использую filter()
, происходит следующее:
// returns list of all lis, not pragraphs.
let filtered = Array.from(wrap.children).filter(item => item.firstElementChild);
// result: temp.js:5 (7) [li, li, li, li, li, li, li]
Я использовал такой фильтр много лет назад, но по какой-то причине он больше не будет работать.
Я что-то пропустил?
Вам нужно использовать map()
, а не filter()
let filtered = Array.from(wrap.children).map(item => item.firstElementChild);
@echomyfield Примите ответ, если вы удовлетворены, и не стесняйтесь спрашивать что-либо, если вы не понимаете
Array.from() дает вам map()
бесплатно. (Array.from(arrayLike [, mapFn [, thisArg]]))
let filtered = Array.from(wrap.children, item => item.firstElementChild);
filter()
ожидает, что из обратного вызова будет возвращено логическое значение, и включает итерируемый элемент, если true
, или пропускает его, если false
.
Ваш вызов Array.from(wrap.children).filter(item => item.firstElementChild);
возвращает массив элементов в wrap.children
, для которых .firstChildElement
возвращает true
.
Это еще один полезный совет, который я пропустил. Большое спасибо.
Ваш код точно такой же, как в вопросе.