微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用于重新组合元素的过滤器将不起作用

如何解决用于重新组合元素的过滤器将不起作用

let wrap = document.querySelector(".wrap");
let temp = document.querySelector(".temp");
temp.addEventListener("click",(event) => {
  // returns pragraph of children[0]. Works fine.
  console.log(wrap.children[0].firstElementChild);

  // returns list of all lis,not pragraphs.
  let filtered = Array.from(wrap.children).filter(item => item.firstElementChild);
  console.log(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.log(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]

我很久以前就使用过这样的过滤器,但有些原因它不再起作用了。

我错过了什么吗?

解决方法

您需要使用 map() 而不是 filter()

let filtered = Array.from(wrap.children).map(item => item.firstElementChild);
,

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。