四、数组及其基本操作(遍历、增删、排序)、循环嵌套、slice、for...of

1. 数组Array

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // 数组Array 引用数据类型
    let names = ['Tom', 'Jerry', 'Jack', 'Rose']

    // 控制台打印整个数组
    console.log(names)

    // 拿到数组某个元素 元素索引/下标
    console.log(names[2])

    // 数组长度
    console.log(names.length)

    // 拿到最后一个元素
    console.log(names[names.length - 1]) 
  </script>
</body>

</html>

遍历数组

数组求和及平均数

数组最大值最小值

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>

  <script>
    let names = ['Tom', 'Jerry', 'Jack', 'Rose']

    // for loop 可生成for循环框架
    /* for (let i = 0; i < array.length; i++) {
      // const element = array[i];
    } */

    // 遍历数组
    for (let i = 0; i < names.length; i++) {
      // console.log(names[i])
    }

    // 数组求和
    let nums = [2, 6, 1, 7, 4]
    let sum = 0
    for (i = 0; i < nums.length; i++) {
      sum += nums[i]
    }
    console.log(`
    数组共有${nums.length}个元素,
    其元素总和为${sum},
    其平均值为${sum / nums.length}
    `)


    let nums2 = [10, 2, 100, 6, 1, 25, 7]
    console.log(nums2.length)
    // 数组最大值
    let max = nums2[0]
    for (let i = 1; i < nums2.length; i++) {
      max = max > nums2[i] ? max : nums2[i]
    }
    console.log(max)

    // 数组最小值
    let min = nums2[0]
    for (let i = 1; i < nums2.length; i++) {
      min = min < nums2[i] ? min : nums2[i]
    }
    console.log(min)
  </script>
</body>

</html>

数组 增删改查

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>

  <script>
    let names = ['小红', '小明', '大强']

    // 查 根据数组元素下标查找
    // console.log(names[0]) // 小红
    // console.log(names[100]) // undefined

    // 改
    // names[0] = '修改数据'

    // 增
    // names[3] = 'jack'
    // 未连续增加数据,下标4和5的元素为空属性
    // names[6] = 'jack'

    // unshift 开头增加,返回值是当前数组的长度
    // console.log(names.unshift('jack'))

    // push 结尾增加,返回值是当前数组的长度
    // console.log(names.push('rose'))

    // 删
    // shift 开头删除,返回值是删除的数据
    // console.log(names.shift())

    // pop 结尾删除,返回值是删除的数据
    // console.log(names.pop())

    // names.splice (索引,删除数据的个数,增加的数据1,增加的数据2...)
    // splice 返回值为被删除元素组成的数组
    // console.log(names.splice(1, 1))

    console.log(names)
  </script>
</body>

</html>

数组筛选

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>

  <script>

    let nums = [2, 0, 6, 1, 77, 0, 52, 10, 18, 29, 45, 5]
    console.log(nums)

    // 筛选出大于等于10的数据 放到新数组中
    let arr1 = []
    for (let i = 0; i < nums.length; i++) {
      if (nums[i] >= 10) {
        arr1.push(nums[i])
      }
    }
    console.log(arr1)

    // 数组去0
    let arr2 = []
    for (let i = 0; i < nums.length; i++) {
      if (nums[i] !== 0) {
        arr2.push(nums[i])
      }
    }
    console.log(arr2)
  </script>
</body>

</html>

案例1-手风琴

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>手风琴案例</title>
  <style>
    .accordion {
      display: flex;
      overflow: hidden;
      width: 1120px;
      height: 260px;
      margin: 50px auto;
    }

    .accordion>div {
      width: 120px;
      border: 1px solid #fff;
      transition: all 0.5s;
    }

    .accordion>div:hover {
      width: 400px;
    }
  </style>
</head>

<body>
  <div class="accordion box">
    <!-- <div><img src="./images/1.jpg" alt=""></div>
    <div><img src="./images/2.jpg" alt=""></div>
    <div><img src="./images/3.jpg" alt=""></div>
    <div><img src="./images/4.jpg" alt=""></div>
    <div><img src="./images/5.jpg" alt=""></div>
    <div><img src="./images/6.jpg" alt=""></div>
    <div><img src="./images/7.jpg" alt=""></div> -->
  </div>

  <!-- scr属性不加引号不报错,HTML容错解析
  示例代码:<img src=images/photo.jpg alt=家庭照片>
  
  如果images/photo.jpg路径中不包含空格或特殊字符,
  并且alt属性的值也不包含这些字符,
  那么上述代码在大多数浏览器中都能够正确解析和显示图像。
  然而,这种做法并不符合HTML规范,也不建议在实际开发中使用。 -->

  <script>
    let arr = [
      './images/1.jpg',
      './images/2.jpg',
      './images/3.jpg',
      './images/4.jpg',
      './images/5.jpg',
      './images/6.jpg',
      './images/7.jpg',
    ]
    // console.log(arr[0]);

    // 1. 课上方法 构建字符串(性能高)
    /* 
      在实际开发中,推荐使用文档片段(未学)或先构建字符串再一次性更新 DOM 的方法,
      以避免频繁操作 DOM 带来的性能问题。同时,这种方法也更具可读性和可维护性。
    */
    let str = ''
    for (let i = 0; i < arr.length; i++) {
      str += `<div><img src="${arr[i]}" alt=""></div>`
    }
    // console.log(str);
    document.querySelector('.box').innerHTML = str
    /*
      好处:
        ①. 性能优化:通过先构建字符串 str,然后一次性设置 innerHTML,可以减少对 DOM 的多次操作,从而提高性能。
        ②. 代码清晰:字符串拼接逻辑与 DOM 操作分离,代码更易于理解和维护。
      坏处:
        内存占用:当 arr 很大时,字符串 str 可能会占用大量内存。
    */

    // 2. 自做
    /* for (let i = 0; i < arr.length; i++) {
      document.querySelector('.accordion').innerHTML += `
        <div><img src="${arr[i]}" alt=""></div>
      `
    } */
    /*
      好处:
        简单直接:代码简单直观,易于理解。
      坏处:
        ①. 性能问题:每次循环都会修改 .accordion 的 innerHTML,这会导致浏览器重新解析和渲染整个 .accordion 元素的内容,效率低下,特别是在 arr 很大时。
        ②. 潜在的错误:如果 .accordion 在 DOM 中不存在,每次循环都会抛出错误。
    */

  </script>
</body>

</html>

数组排序

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>

  <script>
    let arr = [100, 20, 40, 5, 23, 70, 120, 56]
    console.log(arr) // [100, 20, 40, 5, 23, 70, 120, 56]

    // sort 会改变原数组
    // sort 自带功能 → 遍历
    // 升序 元素数值小的在前面

    // 1.升序排列写法
    arr.sort(function (a, b) {
      return a - b
    })
    console.log(arr) // [5, 20, 23, 40, 56, 70, 100, 120]

    // 2.降序排列写法
    arr.sort(function (a, b) {
      return b - a
    })
    console.log(arr) // [120, 100, 70, 56, 40, 23, 20, 5]

  </script>
</body>

</html>

2. 循环嵌套

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>

  <!-- 循环嵌套:外部循环每循环一次,内部循环执行所有次 -->
  <script>
    // 生气 道歉 一天三遍 三天
    for (let i = 0; i < 3; i++) {
      console.log(`第${i + 1}天`)

      for (let j = 0; j < 3; j++) {
        console.log(`第${i + 1}天第${j + 1}遍,巴拉巴拉错了`)
      }
    }
  </script>
</body>

</html>

案例2-生成电影院座位

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>电影院座位</title>
  <link rel="stylesheet" href="./fonts/iconfont.css">
  <link rel="stylesheet" href="./css/index.css">
</head>

<body>
  <div class="movie"></div>
  <div class="cinema">
    <!-- <div class="row">
      <i class="iconfont icon-zuowei"></i>
    </div>
    <div class="row"></div>
    <div class="row"></div>
    <div class="row"></div>
    <div class="row"></div>
    <div class="row"></div> -->
  </div>

  <!-- 课上讲解 -->
  <script>
    // 数组数据的个数用来表示座位数
    // 数组内包数组 二维数组
    // 二维数组取数据 seats[0][0] → seats二维数组的第一个数组元素的第一个值
    let seats = [
      [0, 0, 0, 0, 0],
      [0, 0, 0, 0, 0],
      [0, 0, 1, 1, 1, 1, 0, 0],
      [0, 0, 1, 1, 0, 1, 1, 0, 0],
      [0, 1, 1, 1, 1, 0],
      [0, 0, 0, 0, 0, 0],
    ]

    // 只有每行拼接
    /* for (let i = 0; i < seats.length; i++) {
      let str = ''
      for (let j = 0; j < seats[i].length; j++) {
        str += seats[i][j] !== 1 ? `<i class="iconfont icon-zuowei"></i>` : `<i class="iconfont icon-zuowei" style="color: blue;"></i>`
      }
      document.querySelector(`.row:nth-child(${i + 1})`).innerHTML = str
    } */

    // 所有都拼接
    let str = ''
    for (let i = 0; i < seats.length; i++) {
      let strI = ''
      for (let j = 0; j < seats[i].length; j++) {
        strI += seats[i][j] !== 1 ? `<i class="iconfont icon-zuowei"></i>` : `<i class="iconfont icon-zuowei" style="color: blue;"></i>`
      }
      str += `<div class="row">${strI}</div>`
    }
    document.querySelector('.cinema').innerHTML = str
  </script>

  <!-- 自做 未用字符串拼接 性能差 -->
  <!-- <script>
    // 数组数据的个数用来表示座位数
    let seats = [
      [0, 0, 0, 0, 0],
      [0, 0, 0, 0, 0],
      [0, 0, 1, 1, 1, 1, 0, 0],
      [0, 0, 1, 1, 0, 1, 1, 0, 0],
      [0, 1, 1, 1, 1, 0],
      [0, 0, 0, 0, 0, 0],
    ]

    for (let i = 0; i < seats.length; i++) {
      let row = seats[i]

      for (let j = 0; j < row.length; j++) {
        // .row:nth-child(6)

        // 出现问题 .row:nth-child(${i})错误 i起始值为0 找不到第0个row 为空
        // document.querySelector(`.row:nth-child(${i})`).innerHTML += `

        // 正确做法
        /* document.querySelector(`.row:nth-child(${i + 1})`).innerHTML += `
          <i class="iconfont icon-zuowei"></i>
        ` */

        // 进阶 根据座位是否有人已购票渲染座位颜色
        /*  if (row[j] !== 1) {
           document.querySelector(`.row:nth-child(${i + 1})`).innerHTML += `
             <i class="iconfont icon-zuowei"></i>
           `
         } else {
           // 行内css书写方式 <p style="color: blue; font-size: 20px;">这是一个带有内联样式的段落。</p>
           document.querySelector(`.row:nth-child(${i + 1})`).innerHTML += `
             <i class="iconfont icon-zuowei" style="color: blue;"></i>
           `
         } */
      }
    }

  </script> -->
</body>

</html>

案例3-生成快捷导航

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="./fonts/iconfont.css">
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    nav {
      padding-top: 16px;
      padding-bottom: 24px;
      background: #3f7ef7;
      display: flex;
      align-items: center;
      justify-content: center;
    }

    nav .txt {
      background-color: #588ff8;
      padding: 0px 11px 0 4px;
      color: white;
      height: 26px;
      font-size: 14px;
      border-radius: 13px;
      margin: 0 5px;
      display: flex;
      align-items: center;
      justify-content: center;
    }

    .search {
      background-color: #3f7ef7;
      text-align: center;
      padding-top: 24px;
      margin: 0 auto;
    }

    .search-wrapper {
      margin: 0 auto;
      width: 40%;
      position: relative;
    }

    input {
      padding-left: 60px;
      width: 100%;
      height: 40px;
      border: none;
      outline: none;
      border-radius: 4px;
    }

    header {
      width: 1440px;
      height: 54px;
      margin: 0 auto;
    }

    header img {
      width: 1440px;
      height: 54px;
      display: block;
    }

    .web-icon {
      width: 28px;
      height: 28px;
      position: absolute;
      top: 6px;
      left: 6px;
    }

    .web-icon img {
      width: 100%;
      height: 100%;
      display: block;
    }

    .triangle {
      position: absolute;
      top: 12px;
      left: 38px;
      width: 16px;
      height: 16px;
      line-height: 16px;
      color: #c3c8d0;
      font-size: 12px;
    }

    .txt .iconfont {
      width: 20px;
      height: 20px;
      border-radius: 10px;
      color: white;
      background-color: black;
      text-align: center;
      line-height: 20px;
      margin-right: 6px;
    }

    .icon-github {
      color: white;
      background-color: black;
    }
  </style>
</head>

<body>
  <header>
    <img src="./images/juejin.png" alt="">
  </header>

  <div class="search">
    <div class="search-wrapper">
      <input type="text" placeholder="输入关键词 | tab键切换搜索引擎">
      <div class="web-icon">
        <img src="./images/chrome.png" alt="">
      </div>

      <span class="triangle iconfont icon-xiangxia"></span>
    </div>
  </div>

  <!-- nav H5新增的标签 导航标签 -->
  <nav>
    <!-- <span class="txt">
      <span class="iconfont icon-github"></span>
      github
    </span> -->
  </nav>

  <script>
    // 需求:用户输入2个导航名称,显示到导航区域

    // 默认导航内容
    let navs = ['百度', '抖音', '淘宝']

    /* navs.push(prompt('请输入添加导航名称'))
    navs.push(prompt('请输入添加导航名称')) */
    for (let i = 1; i <= 2; i++) {
      navs.push(prompt('请输入添加导航名称'))
    }

    let str = ''
    for (let i = 0; i < navs.length; i++) {
      str += `
        <span class="txt">
          <span class="iconfont icon-github"></span>
          ${navs[i]}
        </span>
      `
    }
    // console.log(str)
    document.querySelector('nav').innerHTML = str
  </script>

  <!-- 自做 未用字符串拼接 -->
  <!-- <script>
    let navs = ['百度', '抖音', '淘宝']
    navs.push(prompt('请输入添加导航名称'))
    navs.push(prompt('请输入添加导航名称'))
    for (let i = 0; i < navs.length; i++) {
      document.querySelector('nav').innerHTML += `
      <span class="txt">
        <span class="iconfont icon-github"></span>
        ${navs[i]}
      </span>
    `
    }
  </script> -->
</body>

</html>

案例4-九九乘法表

<!-- 课上讲解 -->
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    span {
      /* 转换为行内块元素 → 一行可以共存,宽高还能生效 */
      display: inline-block;
      /* padding: 2px 5px; */
      width: 70px;
      /* height: 30px; */
      border: 1px solid lightcoral;
      padding-left: 5px;
    }
  </style>
</head>

<body>

  <!-- <p>
    <span></span>
  </p> -->

  <script>
    // 九九乘法表
    let strI = ''
    for (let i = 1; i <= 9; i++) {
      let strJ = ''
      for (let j = 1; j <= i; j++) {
        strJ += `<span>${j}×${i}=${j * i}</span>`
      }
      strI += `<p>${strJ}</p>`
    }
    document.write(strI)
  </script>
</body>

</html>


<!-- 自做 -->
<!-- <!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    table {
      border-collapse: collapse;
      margin: 0 auto;
      color: hotpink;
    }

    td {
      border: 1px solid blueviolet;
      padding: 3px 8px;
    }
  </style>
</head>

<body>

  <table>
  </table>

  <script>
    // 九九乘法表
    let strRow = ''
    for (let i = 1; i <= 9; i++) {
      let str = ''
      for (let j = 1; j <= i; j++) {
        str += `<td>${j}×${i}=${i * j}</td>`
      }
      strRow += `<tr>${str}</tr>`
    }
    document.querySelector('table').innerHTML = strRow
  </script>
</body>

</html> -->

3. 作业

3.1 数组版-渲染王者荣耀头像

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    .box {
      width: 600px;
      margin: 0 auto;
      display: flex;
      flex-wrap: wrap;
    }

    img {
      width: 100px;
      height: 100px;
      border-radius: 10px 0;
      border: 2px solid blue;
      margin-bottom: 10px;
      margin-right: 10px;
    }
  </style>
</head>

<body>

  <div class="box">
    <!-- <img src="./images/1.webp" alt=""> -->
  </div>

  <!-- 
    根据用户输入的个数,页面可以渲染对应王者荣耀英雄的个数
  -->
  <script>
    // 图片路径数组
    let arr = []
    for (let i = 1; i <= 20; i++) {
      arr.push(`./images/${i}.webp`)
    }

    // 判断输入数字是否复合规范
    for (; ;) {
      let num = +prompt('请输入1~20个之间的英雄的个数:')
      if (num > 0 && num <= 20) {
        let str = ''
        for (let i = 0; i < num; i++) {
          str += `<img src="${arr[i]}" alt="">`
        }
        document.querySelector('.box').innerHTML = str
        break
      } else {
        alert('输入数字错误,请输入正确的数字哦')
      }
    }

  </script>
</body>

</html>

3.2 slice

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>

  <script>
    // 参考网址
    // https://wangdoc.com/javascript/stdlib/array#slice

    // 实现对 数组 arr 进行快速复制得到新数组
    let arr = [10, 20, 30]
    console.log(arr)

    let newArr = arr.slice()
    console.log(newArr)

  </script>
</body>

</html>

3.3 for...of

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>

  <script>
    // 参考网址
    // https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/for...of

    // 使用for...of 语句来遍历数组,进行求和
    let arr = [10, 20, 30]

    let sum = 0
    for (let i of arr) {
      sum += i;
    }
    console.log(sum);
  </script>
</body>

</html>

3.4 选择排序算法

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>

  <script>
    // 选择排序算法
    let arr = [4, 2, 5, 1, 3]
    for (let i = 0; i < arr.length - 1; i++) {
      for (let j = 0; j < arr.length - i - 1; j++) {
        // 开始交换 但是前提第一个数大于第二个数才交换
        if (arr[j] > arr[j + 1]) {
          // 交换2个变量
          let temp = arr[j]
          arr[j] = arr[j + 1]
          arr[j + 1] = temp
        }
      }
    }
    console.log(arr)
  </script>
</body>

</html>

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值