9.9-day06-js基础

18 阅读6分钟

1. 冒泡排序

// 1.外层循环-1
      // 2.内层循环-1又-i
      // 3.内循环相邻个比较大小
      // 4.邻里交互位置


      //交互位置
      //         0   1
      // var arr = [11, 22];
      // var temp = arr[0];//备份了一份 11
      // arr[0] = arr[1];
      // arr[1] = temp

      // var temp = arr[1];
      // arr[1] = arr[0];
      // arr[0] = temp;


      // [6, 5, 7, 4, 3];  //i=0
      // 1轮
      // [5, 6, 7, 4, 3]; 1趟
      // [5, 6, 7, 4, 3]; 2趟
      // [5, 6, 4, 7, 3];
      // [5, 6, 4, 3, 7];  //出现了最大的 7
      // 2轮
      // [5, 6, 4, 3];  //出现了最大的 7
      // [5, 4, 6, 3];
      // [5, 4, 3, 6];  //出现了最大的 6,7

      // [4, 5, 3];  //出现了最大的 6,7
      // [4, 3, 5];

      // [4, 3];  //出现了最大的 5, 6,7

      // // [3, 4];  //出现了最大的4, 5, 6,7


      // // [11,22]

      var arr = [5, 6, 7, 4, 3];
      // 2个数,比较1轮,同理,5个数,比较4轮
      for (var i = 0; i < arr.length - 1; i++) {
        // -1 防止下标越界,  j+1 ,容易出现越界
        for (var j = 0; j < arr.length - 1 - i; j++) {
          // 前一个数和后一个数,比较 是 j 和 j+1
          if (arr[j] < arr[j + 1]) {
            var temp = arr[j + 1];
            arr[j + 1] = arr[j];
            arr[j] = temp;
          }
        }
      }

      console.log(arr);

      //1.为什么外循环要-1?
      //2.为什么内循环要 -1又减-i;
      // -1 防止下标越界,  j+1 ,容易出现越界
      //3.比较的时候,为什么是j和j+1;
      //  前一个数和后一个数,比较

2. 选择排序

// 打擂台,
      //台上和台下的比较
      var arr = [5, 6, 7, 4, 3];
      //外出循环是台上
      for (var i = 0; i < arr.length - 1; i++) {
        // 认为 第一个上台的人,能够赢
        var win = i;
        //内层循环,是台下
        for (var j = i + 1; j < arr.length; j++) {
          if (arr[win] < arr[j]) {
            win = j;//改win的值
          }
        }
        //交互位置
        if (win != i) {
          var temp = arr[win];
          arr[win] = arr[i];
          arr[i] = temp;
        }
      }
      console.log(arr);

3. 快速排序

// [4,8,3]  //3/2=1.5  取整-->1
      //[5, 6, 7, 4, 3];
      //1.定义个方法,输入一个数组
      //2.如果数组的长度小于2,就返回输入的数组 (小于2个,没办法比较)
      //3.如果是大于等于2,找出下标,遇到不能被整除,向下取整
      //4.通过中间下标,得到中间数,并且要从原来数组扣出来
      //5.准备2个空数组,左边和右边的空数组
      //6.大于中间数 放置 右边数组,否则放置左边数组
      //7. 递归进行继续拆,拆到只有1个数的数组,就不拆
      //   进行合并  左边数组+中间+右边数组

      //1.定义个方法,输入一个数组
      function quickSort(arr) {
        // 2.如果数组的长度小于2,就返回输入的数组 (小于2个,没办法比较)
        if (arr.length < 2) {//临界点
          return arr; //返回数组
        }
        //3.如果是大于等于2,找出下标,遇到不能被整除,向下取整
        var middleIndex = parseInt(arr.length / 2);
        //4.通过中间下标,得到中间数,并且要从原来数组'扣'出来
        var middleVal = arr.splice(middleIndex, 1)
        //5.准备2个空数组,左边和右边的空数组
        var left = [], right = [];
        //6.大于中间数 放置 右边数组,否则放置左边数组
        for (var i = 0; i < arr.length; i++) {
          if (arr[i] > middleVal) {
            right.push(arr[i])
          } else {
            left.push(arr[i]);
          }
        }
        //7. 递归进行继续拆,拆到只有1个数的数组,就不拆
        //   进行合并  左边数组+中间+右边数组
        return quickSort(left).concat(middleVal, quickSort(right))

      }

4. 高阶函数

// es3 
      //  pop,push,shift,unshift,sort,reverse(),concat(),join,slice,splice
      // es5 高阶函数
      //   forEach,map,some,ervey,filter,reduce ,indexof
      // es6 
      //    find,findIndex,includes

      //1.forEach,只能做遍历,没有返回值
      //       不能被中断
      //  可以制造异常,结合 try..catch 中断
      var arr = [11, 22, 33, 44, 55];
      try {
        arr.forEach(function (item, index, aaa) {
          console.log(item, index, aaa);
          if (index == 2) {
            throw new Error("制造异常")
          }
        })
      } catch (error) {

      }

      console.log("11111");

      //2.map 能做遍历,返回一个新的数组 
      //    新数组的内容,由回调函数决定
      var arr = [11, 22, 33, 44, 55];
      var res = arr.map(function (item, index, arr) {
        return item * 10
      });

      console.log(res);
      console.log(arr);
      //3.some 只要有1个满足,就返回true
      //  在遍历过程中,条件满足,就中断遍历
      var arr = [11, 22, 33, 44, 55];
      var res = arr.some(function (item) {
        console.log(item);
        return item == 99
      });
      console.log(res);

      //4. ervery 所有的满足条件,才会返回true,默认返回false
      var arr = [11, 22, 33, 44, 55];
      var res = arr.every(function (item) {
        return item > 10
      });
      console.log(res);

      //5.filter过滤 返回新的数组,数组的内容由回调函数的条件决定
      var arr = [11, 22, 33, 44, 55];
      var res = arr.filter(function (item) {
        return item > 30;
      })
      console.log(res);

      //6.find  (ES6)
      // 通过条件,查找某一项,如果存在,就返回这一项
      var arr = [
        { id: 1, name: "刘德华", age: 20 },
        { id: 2, name: "蔡徐坤", age: 21 },
        { id: 3, name: "吴彦祖", age: 23 },
        { id: 4, name: "彭于晏", age: 24 }];

      var res = arr.find(function (item, index) {
        return item.id == 4
      });
      console.log(res);
      //7.findIndex (es6)
      // 返回满足条件某一项的下标
      var arr = [
        { id: 1, name: "刘德华", age: 20 },
        { id: 2, name: "蔡徐坤", age: 21 },
        { id: 3, name: "吴彦祖", age: 23 },
        { id: 4, name: "彭于晏", age: 24 }];

      var index = arr.findIndex(function (item) {
        return item.id == 3
      })
      console.log(index);
      //8.indexOf
      // 找到了返回下标,找不到返回-1
      // 它有2个参数,第2个参数默认是从0开始,也可以指定开始位置
      var arr = [11, 22, 33, 44, 55];
      console.log(arr.indexOf(22, 2)); //22的下标是1

      //9.lastIndexOf
      var arr = [11, 22, 33, 44, 55, 22, 88, 22, 77];
      console.log(arr.lastIndexOf(22, 3));//用得少

      //10.includes
      var arr = [11, 22, 33, 44, 55, 22, 88, 22, 77];
      console.log(arr.includes(100));


      // find,findIndex,indexOf,lastIndexOf,includes
      //10.reduce
      // typescript

      var arr = [11, 22, 33, 44, 55];
      //现在的reduce只传入了一个参数 回调函数
      //pre是上一次回调函数的返回值,没就是undefined
      // arr.reduce(function (pre, cur, index, arr) {
      //   console.log(pre, cur);
      // })

      // reduce有2个参数,第1个参数是回调函数,第2参数给pre的初始值
      var arr = [11, 22, 34, 44, 55];
      // arr.reduce(function (pre, cur) {
      //   console.log(pre, cur);
      //   return 1
      // }, 100)

      // arr.reduce(function (pre, cur) {
      //   console.log(pre, cur);
      //   return 1
      // })

      var res = arr.reduce(function (pre, cur) {
        // pre 11 cur 22  -->33
        // pre 33 cur 34  -->67
        // pre 67 cur 44  -->111
        // pre 111 cur 55 --> 166
        return pre + cur;  //这个return决定了下一轮循环pre的值
      });
      console.log(res); //166


      //数组去重
      var arr = [1, 5, 7, 2, 5, 7, 1, 2, 5, 8, 6];
      function notRepeat(list) {
        var newArr = [];//新的空数组
        for (var i = 0; i < list.length; i++) {
          //把每一项放到空数组,在放到空数组之前,问 是否已存在,
          //如果存在,就不添加
          // if (newArr.indexOf(list[i]) == -1) {
          //   newArr.push(list[i])
          // }
          // includes 找到了返回true,找不到返回false
          if (!newArr.includes(list[i])) {
            newArr.push(list[i])
          }
        }
        return newArr;
      }
      console.log(notRepeat(arr));

      //es3
      //1.pop()
      //2.push()
      //3.shift()
      //4.unshift();
      //5.sort();
      //6.reverse()
      //7.slice()
      //8.splice()
      //9.concat()
      //10.join

      //es5
      //11.forEach()
      //12.map()
      //13.some()
      //14.every()
      //15.filter()
      //16.reduce()

      //es6
      //17.find()
      //18.findIndex()
      //19.includes()

      //20.indexOf()

6. 数组的练习

// 1, 求数组中所有元素的和
      var arr = [11, 22, 33, 44, 55];
      var result = 0;//用于统计结果
      for (var i = 0; i < arr.length; i++) {
        result += arr[i];
      }
      console.log(result);

      // 2, 让数组中的元素交换位置(重要)
      var arr = [11, 22];
      var temp = arr[0];// 11
      arr[0] = arr[1]; // [22,22];
      arr[1] = temp;
      console.log(arr);

      // 3, 求数组的最大数和最小数(重要)
      var arr = [3, 7, 5, 2, 8, 6];
      //假设第1个事最大的
      var max = arr[0];
      var min = arr[0];//假设第一个是最小的
      for (var i = 1; i < arr.length; i++) {
        if (max < arr[i]) {
          max = arr[i];
        }
        if (min > arr[i]) {
          min = arr[i]
        }
      }
      console.log(max);
      console.log(min);

      // 4, 求数组的最小数的下标(重要)
      var arr = [3, 7, 5, 2, 8, 6];
      var min = arr[0];//假设第一个是最小的
      var minIndex = 0;
      for (var i = 1; i < arr.length; i++) {
        if (min > arr[i]) {
          min = arr[i];
          minIndex = i;
        }
      }
      console.log(minIndex);


      // 1,  不改变原数组, 取出数组[3,2,4,5,8,6,3,9]中的[5,8,6].
      var arr = [3, 2, 4, 5, 8, 6, 3, 9];  // 3 6
      console.log(arr.slice(3, 6));


      // 2, 在数组[1,2,3,4,6,7,8]中对应的位置插入5, 变成[1,2,3,4,5,6,7,8]
      var arr = [1, 2, 3, 4, 6, 7, 8];
      arr.splice(4, 0, 5)
      console.log(arr);
      // 3, 将数组 ["我","是","一","只","笨","鸟"] 改成
      //  ["我","是","一","只","聪","明","鸟"], 并打印出: "我是一只聪明鸟"
      var arr = ["我", "是", "一", "只", "笨", "鸟"];
      arr.splice(4, 1, "聪", "明");
      console.log(arr.join(""));

      // 4, 删除数组[20,23,21,34,54,55,32]中的倒数第二个和倒数第三个元素
      var arr = [20, 23, 21, 34, 54, 55, 32];
      arr.splice(4, 2);
      console.log(arr);



      // 1, 将数组[1, 5, 6, 3, 2, 8, 9, 4] 降序排序
      var arr = [1, 5, 6, 3, 2, 8, 9, 4];
      arr.sort(function (a, b) {
        return a - b;
      })
      console.log(arr);
      // 2, 请将数组[1,46,74,3,5,5]中的元素右移1位
      var arr = [1, 46, 74, 3, 5, 5]
      arr.unshift(arr.pop());
      console.log(arr);

      // 3, 插数:在数组[1,46,74,3,5,5]的下标为2的位置插入一个数字8,
      //     结果为[1,46,8,74,3,5,5]

      var arr = [1, 46, 74, 3, 5, 5];
      arr.splice(2, 0, 8);
      console.log(arr);

回顾:

1.数组的方法
    pop() 删除最后一位,返回被删除的元素
    push() 往最后位置添加(1个或多个),返回数组的新长度
    shift() 删除数组的第一位,返回被删除的元素
    unshift() 往数组的第一位添加(1个或多个)元素,返回数组的新长度
    sort()  它是默认根据ASCII码,进行排序 (10以上的数字,无法准确的排序)
         给它一个回调函数(callback), a-b 升序,b-a 降序
    reverse() 倒序
    concat() 合并数组
    slice() 截取,不会改变原来数组
    splice()  删除,插入,替换
    join() 根据指定格式返回字符串,默认是以"逗号"隔开

    能够实现浅拷贝的方法
    slice(),concat()

    forfor..in
    for是根据数组的长度,决定遍历的次数
    for..in,根据数组的成员,来决定次数