练习四、把数组扁平;获取页面所用标签,并去重

  1. 功能描述:

题目一:将多层嵌套数组降低层级,比如[ 1, 2, [3, 0,[4, [5]]],10,[200,3] ]扁平到[ 1, 2, 3, 0, 4, 5, 10, 200, 3]

题目二:获取页面所用标签,比如应含有html多种标签(并且去重)

  1. 主要考点:

题目一:判断是否为数组的方法,数组某个下标的元素删除与插入

题目二:①数组的去重判断(indexOf函数使用)。

②获取元素标签的方法(document.getElementsByTagName() 与.querySelector)。

③函数递归使用方法

  1. 使用框架或语言:elementui ,js

  1. 相关代码

<template>
  <div class="stylebg">
    2/22
    <div>
      <span>题目1:将多层嵌套数组降低层级,比如[ 1, 2, [3, 0,[4, [5]]],10,[200,3] ]扁平到[ 1, 2, 3, 0, 4, 5, 10, 200, 3]</span>
    </div>
    <div>
      <span>题目2:获取页面所用标签,比如应含有html多种标签(并且去重)</span>
    </div>
  </div>
</template>

<script>
export default {
  data(){
    return{
      //存放节点2的数组
      nodeArr : []
    }
  },
  mounted(){
    this.count()
    this.search()
  },
  methods:{
    //题目1:将多层嵌套数组降低层级,比如[ 1, 2, [3, 0,[4, [5]]],10,[200,3] ]扁平到[ 1, 2, 3, 0, 4, 5, 10, 200, 3]
    count(){
      var arr = [ 1, 2, [3, 0,[4, [5]]],10,[200,3] ];
      var oArr1 = arr ;

      //1.遍历第一层数组中每个元素是否为数组
      //(陷进:不能使用typeOf进行判断,typeOf只能判断数组,null及对象是一个对象,只能判断string,数字,undefined,真假)
      //方法一,使用array对象中的isArray()函数判断
      console.log('a1',Array.isArray(oArr1))
      //方法二,使用instanceof,原理:判断左边的oArr实例的__proto__(隐式原型)是否属于右边Array的prototype(显示原型)
      console.log('a2',oArr1 instanceof Array)
      //方法三,使用变量.__proto__ === 对象Array.prototype,原型链的顶端是否相同判断
      console.log('a3',oArr1.__proto__ === Array.prototype)
      //方法四,打印该对象的原型链是什么类型判断
      console.log('a4',Object.prototype.toString.call(oArr1))

      for(var count = 0 ; count < oArr1.length ; count++){
        if(oArr1[count].__proto__ === Array.prototype){
          //2.该元素进行提取出来
          //使用.reverse的原因是
          // 例如把[3,4]插入到[0,1,2]的1与2中间,插入的默认下标都为1,而先插入3再插入4,会变成[0,1,4,3,2]
          //所以先把数组倒序再进行插入不会出现[0,1,4,3,2]的情况而是[0,1,3,4,2]的情况
          let getArr = oArr1[count].reverse()
          oArr1.splice(count,1)
          console.log(oArr1,getArr)
          //3.通过遍历进行把提出的数组写入到oArr的相应的位置
          for(var count2 = 0 ; count2 <getArr.length; count2++){
            oArr1.splice(count,0,getArr[count2])
          }
          //外层计数器向前移一位,回到找到数组类型元素的位置重新判断元素是否数组
          count--
        }
      }
      console.log('完成的数组为',oArr1)
    },

    // 题目2:获取页面所用标签,比如应含有<html><head><meta><style><body>等标签(并且去重)
    search(){

      //解法一(document.getElementsByTagName())
      //使用document.getElementsByTagName('*'),*代表获取该页面的所有元素
      var view = document.getElementsByTagName('*')
      // console.log('view的类型',Object.prototype.toString.call(view))

        //循环写法一 for
        let checkArr1 = []
        for(var count = 0 ; count<view.length ; count++){
          //判断数组checckArr1里面是否含有view[count]的html元素名称,数组.indexOf(元素名) == -1是不存在,0是存在
          if(checkArr1.indexOf(view[count].nodeName) == -1){
            checkArr1.push(view[count].nodeName)
          }
        }
        console.log('得到的该页面的所有标签是',checkArr1)

        //循环写法二 forEach
        // let checkArr2 = []
        // view.forEach( el => {
        //   if(checkArr2.indexOf(el.nodeName) == -1){
        //     checkArr2.push(el.nodeName)
        //   }
        // })
        // console.log('得到的该页面的所有标签是',checkArr2)



      //解法二 .querySelector与node.children的递归遍历node节点
      //1. 使用选择器.querySelector选择html标签下所有的节点(包括本身html的节点)
      var view2 = document.querySelector('html')
      //2.把父节点的标签保存进nodeArr数组中
      this.nodeArr.push(view2.nodeName)
      //3.调用countNode()函数开始计算父节点以下的node节点中的html
      this.countNode(view2.children)

      // if(view2.children)
      console.log(view2,this.nodeArr)
    },

    //遍历子节点的html
    countNode(node){
      for(var count = 0 ; count<node.length ; count++){
        //检查改定位的节点下是否含有子节点
        if(node[count].children.length !=0){
          //有即node[count].children.length == -1 ,保存子节点,并调用countNode()函数并往下继续寻找改节点下的孙节点
          if(this.nodeArr.indexOf(node[count].nodeName) == -1){
            this.nodeArr.push(node[count].nodeName)
          }
          this.countNode(node[count].children)
        }else{
          //没有即node[count].children.length == 0 ,保存子节点
          if(this.nodeArr.indexOf(node[count].nodeName) == -1){
            this.nodeArr.push(node[count].nodeName)
          }
        }
      }
    }

  }
}
</script>

<style scoped>

</style>
  1. 运行截图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值