写给 Javascript 初级学者的第 5 份笔记持续更新中~~~

171 阅读3分钟

数组遍历的常用方法:

1.forEach方法:

  1. 语法:数组.forEach(function(item,index,origin) { } )
  2. 作用:遍历数组
  3. 返回值:该方法永远没有返回值(undefined)
forEach方法:
<script>
  var arr = [100, 200, 300, 400, 500, 600]
        console.log('原始数组: ', arr)

            arr.forEach(function (item, index, origin) {
            console.log(item, index)//100 0 200 1 300 2 400...
        })
</script>
注意事项:
(1)item:表示数组每一项所对应得值
(2)index:表示数组每一项的值所对应得下标
(3)origin:原始数组
(4)prev:表示初始值或者上一次的运行结果
  • map方法:
  1. 语法:数组.map(function(item,index,origin) { } )
  2. 作用:映射数组
  3. 返回值:返回一个和原数组长度相同的数组,但是内部数据可以经过我们映射加工
  4. 映射加工:就是在函数内 以 return 的形式书写
 map方法:
 <script>
  var arr = [100, 200, 300, 400, 500, 600]
        console.log('原始数组: ', arr)
        
        var newArr = arr.map(function (item) {
            return item * 2
        })
        console.log('映射出来的数组: ', newArr) //200 400 600 800 1000 1200

 </script>
  • 面试题:数组常用的遍历方法中, 有一个forEach 和 一个 map, 这两个方法有什么区别?
 1. forEach 的作用是用来遍历数组, 而 map 的作用是用来映射数组;
 2. forEach 没有返回值, 而 map 是可以有返回值的;
  • filter方法:
  1. 语法:数组.filter(function(item,index,origin){})
  2. 作用:过滤数组
  3. 返回值:返回一个新数组,内部存储的是原始数组过滤出来的部分内容
  4. 过滤条件:以 return 的形式书写;
filter方法:
 <script>
 var arr = [100, 200, 300, 400, 500, 600]
        console.log('原始数组: ', arr)
        
         var newArr = arr.filter(function (item, index, origin) {
            return item > 350   // 过滤数组的内容, 只留下 item 大于 350 的成员
        })
        console.log("新的数组是:",newArr)//400 500 600
 </script>
  • find方法:
  1. 语法:数组.find(function(item,index,origin){})
  2. 作用:在数组内查找满足条件的第一项
  3. 返回值:找到的新成员,如果没有找到直接返回:undefined
  4. 查找条件:以 return 的形式书写
find方法:
 <script>
 var arr = [100, 200, 300, 400, 500, 600]
        console.log('原始数组: ', arr)
        
         var newArr = arr.find(function (item, index, origin) {
            return item > 350   // 在数组中查找第一个符合条件的成员
        })
        console.log(newArr)    //400
        
        var newArr1 = arr.find(function (item, index, origin) {
            return item > 35000   // 在数组中查找第一个符合条件的成员
        })
        console.log(newArr1)    //undefined 

 </script>
  • findIndex方法:
  1. 语法:数组.findIndex(function(item,index,origin){})
  2. 作用:在数组内查找满足条件的第一项的下标
  3. 返回值:返回已经找的数组所对应的下标,如果没有找到符合条件的直接返回值 -1;
  4. 查找条件:以 return 的形式书写
findIndex方法:
 <script>
 var arr = [100, 200, 300, 400, 500, 600]
        console.log('原始数组: ', arr)
        
         var newArr = arr.findIndex(function (item, index, origin) {
            return item > 350 //在数组内查找第一个符合条件的成员所对应得下标
        })
        console.log(newArr)   // 3
        
         var newArr1 = arr.findIndex(function (item, index, origin) {
            return item > 35000  //在数组内查找第一个符合条件的成员所对应得下标
        })
        console.log(newArr1)    // -1
 </script>
  • some 方法:
  1. 语法:数组.some(function(item,index,origin){})
  2. 作用:判断数组内是否有一个满足条件
  3. 返回值: 布尔值 (true/false)
  4. 判断条件:以return的形式书写
some 方法:
 <script>
 var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
        console.log('原始数组: ', arr)
        
         var bo1 = arr.some(function (item, index, origin) {
            return item % 2 === 0   // 判断数组内是否有  一个  满足条件的
        })
        console.log(bo1)    // true 
 </script>
  • every方法:
  1. 语法:数组.every(function(item,index,origin){})
  2. 作用:判断数组内是否全部满足条件
  3. 返回值:布尔值 (true/false)
  4. 判断条件:以 return 的形式书写
every方法:
 <script>
 var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
        console.log('原始数组: ', arr)
        
       var bo2 = arr.every(function (item, index, origin) {
             return item % 2 === 0   // 判断数组内是否 全都满足条件
        })
        console.log(bo2)    //false
        
 </script>
  • reduce方法:
  1. 语法:数组.reduce(function(prev,item,index,origin){}, init )
  2. 作用:用来实现叠加效果
  3. 返回值:最终叠加的结果
  4. 叠加条件: 以return的形式书写
注意事项:
1.prev第一次的值,如果传递了init那么就是init的值;如果没有传递init,那么就是数组[0]的值;
2.如果传递了init,循环执行 数组.length次;如果没有传递init,循环执行 数组.length-1次;
 reduce方法:
(1) 传递 init 参数的执行结果:
  <script>
    var arr = [1, 2, 3]
        console.log('原始数组: ', arr)
        
        var str = arr.reduce(function (prev, item, index, origin) {
            return prev + item
        }, 22) //init 传递了参数 所以prev第一次的值是22
        console.log(str)    // 28
  </script>
 reduce方法:
 (2)没有传递 init 参数的执行效果:
   <script>
    var arr1 = [100, 2, 3,4,5]
        console.log('原始数组: ', arr)

        var str = arr1.reduce(function (prev, item, index, origin) {
            return prev + item
        }) //init 没有传递参数,所以prev第一次执行的值是数组[0]上的值,而此时item所执行的值是数组[1]所对应得值
        console.log(str)    // 114
   </script>

数组塌陷的原理和解决方法:

数组塌陷产生的现象:
当删除第一个数组元素之后,原数组的第二个数组元素会填补第一个数组元素的空缺位置,也就是说此时第二个元素的下标已经变成了0,然而第一次的循环遍历已经遍历过下标为0的数组元素了,于是原本下标为1的数组元素变成了漏网之鱼;

 <script>
 var arr = [0,1,2,3,4,5]
 //         0 1 2 3 4 5
            console.log("原始数组:",arr);
            
            for(var i = 0; i<arr.length; i++){//数组发生塌陷
            arr.splice(i,1);
        }
        console.log("删除后的数组:",arr);// arr = [1,3,5]
  发生塌陷执行步骤简述:
    /**
         * 第一轮:
         * i===0  arr.length=6   i<arr.length => 0<6 条件成立开始运行
         * arr.splice(i,1)  -> (0,1) 把[0]位置上的数字截取掉了,也就是把 数字0 截取掉
         * 截取后的数组:  arr = [1,2,3,4,5]
         * 对应得下标     //     0 1 2 3 4 
         * 数组的length === 5
         * 第二轮:
         * i===1  arr.length=5   i<arr.length => 1<5 条件成立开始运行
         * arr.splice(i,1)  -> (1,1) 把[1]位置上的数字截取掉了,也就是把 数字2 截取掉
         * 截取后的数组:  arr = [1,3,4,5]
         * 对应得下标     //     0 1 2 3 
         * 数组的length === 4
         * 第三轮:
         * i===2  arr.length=4   i<arr.length => 2<4 条件成立开始运行
         * arr.splice(i,1)  -> (2,1) 把[2]位置上的数字截取掉了,也就是把 数字4 截取掉
         * 截取后的数组:  arr = [1,3,5]
         * 对应得下标     //     0 1 2 
         * 数组的length === 3
         * 第四轮:
         * i===3   arr.length=3   i<arr.length => 3=3 条件不成立 结束运行
        */
        </script>

```js
<script>
 数组塌陷的解决方法1:
  var arr = [0,1,2,3,4,5]
 //          0 1 2 3 4 5
            console.log("原始数组:",arr);
            
         for(var i = 0; i<arr.length; i++){
            arr.splice(i,1);
            i--
        }
        console.log("删除后的数组:",arr);//[]
 执行步骤简述:
  /**
         * 第一轮:
         * i===0  arr.length=6   i<arr.length => 0<6 条件成立开始运行
         * arr.splice(i,1)  -> (0,1) 把[0]位置上的数字截取掉了,也就是把 数字0 截取掉
         * 截取后的数组:  arr = [1,2,3,4,5]
         * 对应得下标     //     0 1 2 3 4 
         * 此时  i--   ==>  i= -1
         * 最后 i++    ==>  i= 0
         * 数组的length === 5
         * 
         * 第二轮:
         * i===0  arr.length=5   i<arr.length => 0<5 条件成立开始运行
         * arr.splice(i,1)  -> (0,1) 把[0]位置上的数字截取掉了,也就是把 数字1 截取掉
         * 截取后的数组:  arr = [2,3,4,5]
         * 对应得下标     //     0 1 2 3  
         * 此时  i--   ==>  i= -1
         * 最后 i++    ==>  i= 0
         * 数组的length === 4
         * 
         * 第三轮:
         * i===0  arr.length=4   i<arr.length => 0<4 条件成立开始运行
         * arr.splice(i,1)  -> (0,1) 把[0]位置上的数字截取掉了,也就是把 数字2 截取掉
         * 截取后的数组:  arr = [3,4,5]
         * 对应得下标     //     0 1 2 
         * 此时  i--   ==>  i= -1
         * 最后 i++    ==>  i= 0
         * 数组的length === 3
         * 
         * 第四轮:
         * i===0  arr.length=3   i<arr.length => 0<3 条件成立开始运行
         * arr.splice(i,1)  -> (0,1) 把[0]位置上的数字截取掉了,也就是把 数字3 截取掉
         * 截取后的数组:  arr = [4,5]
         * 对应得下标     //     0 1 
         * 此时  i--   ==>  i= -1
         * 最后 i++    ==>  i= 0
         * 数组的length === 2
         * 
         * 第五轮:
         * i===0  arr.length=2   i<arr.length => 0<2 条件成立开始运行
         * arr.splice(i,1)  -> (0,1) 把[0]位置上的数字截取掉了,也就是把 数字 4 截取掉
         * 截取后的数组:  arr = [5]
         * 对应得下标     //     0 
         * 此时  i--   ==>  i= -1
         * 最后 i++    ==>  i= 0
         * 数组的length === 1
         * 
         * 第六轮:
         * i===0  arr.length=1   i<arr.length => 0<1 条件成立开始运行
         * arr.splice(i,1)  -> (0,1) 把[0]位置上的数字截取掉了,也就是把 数字 5 截取掉
         * 截取后的数组:  arr = []
         * 对应得下标     //     
         * 此时  i--   ==>  i= -1
         * 最后 i++    ==>  i= 0
         * 数组的length === 0
         * 
         * 第七轮:
         * i===0  arr.length=0  i<arr.length => 0<0 条件不成立
         * */ 
        
</script>
<script>
 数组塌陷的解决方法二:
  var arr = [1, 2, 3, 4];
  //         0  1  2  3
     for (var i = arr.length - 1; i >= 0; i--) {
        arr.splice(i, 1);
    }
    console.log(arr);//[]
    
执行步骤简述:
  /**
     * 第一次执行:
     * i = arr.length - 1  ==>  i=3   i>=0   条件成立 开始执行代码
     * arr.splice(i, 1); ==>  (3,1) 此时把数组[3] 位置上的 4 截取掉
     * 截取后的数组:arr = [1, 2, 3]
     *                    0  1  2 
     * 此时length ==> 3
     * i--  此时i = 2
     * 
     * 第二次执行:
     * i = arr.length - 1  ==>  i=1   i>=0   条件成立 开始执行代码
     * arr.splice(i, 1); ==>  (1,1) 此时把数组[1] 位置上的 2 截取掉
     * 截取后的数组:arr = [1, 3]
     *                    0  1  
     * 此时length ==> 2
     * i--  此时i = 1
     * 
     * 第三次执行:
     * i = arr.length - 1  ==>  i=0   i=0>=0   条件成立 开始执行代码
     * arr.splice(i, 1); ==>  (0,1) 此时把数组[0] 位置上的 1 截取掉
     * 截取后的数组:arr = [3]
     *                    0  
     * 此时length ==> 1
     * i--  此时i = 0
     * 
     * 第四次执行:
     * i = arr.length - 1  ==>  i=0   i=0>=0   条件成立 开始执行代码
     * arr.splice(i, 1); ==>  (0,1) 此时把数组[0] 位置上的 3 截取掉
     * 截取后的数组:arr = []   
     * 此时length ==> 0
     * i--  此时i = -1
     * 
     * 第五次执行:
     * i = arr.length - 1  ==>  i=-1     条件现在不成立成立 代码结束执行
    */
</script>