12.29---03数组的常用方法3

58 阅读6分钟

数组遍历的常用方法

*  1. forEach
     *      * 语法: 数组.forEach(function (item, index, origin) {})
     *              * item: 数组的每一项 的值
     *              * index: 数组的每一项 对应的下标
     *              * origin: 原始数组  (了解即可, 一般没人用)
     *      * 作用: 遍历数组
     *      * 返回值: 该方法永远没有返回值 (undefined)
     * 
     *  2. map
     *      * 语法: 数组.map(function (item, index, origin) {})     三个参数的意义与 forEach 相同
     *      * 作用: 映射数组
     *      * 返回值: 返回一个和原数组长度相同的数组, 但是内部数据可以经过我们的映射加工
     *      * 映射加工: 就是在函数内 以 return 的形式书写
     * 
     *  有一道面试题: 数组常用的遍历方法中, 有一个forEach 和 一个 map, 这两个方法有什么区别?
     *          1. forEach 的作用是用来遍历数组, 而 map 的作用是用来映射数组
     *          2. forEach 没有返回值, 而 map 是可以有返回值的
     * 
     *  3. filter
     *      * 语法: 数组.filter(function (item, index, origin) {})      三个参数的意义与 forEach 相同
     *      * 作用: 过滤数组
     *      * 返回值: 返回一个新数组, 内部存储的是原始数组过滤出来的部分内容
     *      * 过滤条件: 过滤条件以 return 的形式书写
     * 
     *  4. find
     *      * 语法: 数组.find(function (item, index, origin) {})        三个参数的意义 与 forEach 相同
     *      * 作用: 在数组内查找满足条件的第一项
     *      * 返回值: 找到的数据, 如果没找到返回的是 undefined
     *      * 查找条件以 return 的形式书写
     * 
     *  5. findIndex
     *      * 语法: 数组.findIndex(function (item, index, origin) {})       三个参数的意义 与 forEach 相同
     *      * 作用: 在数组内查找满足条件的第一项 的下标
     *      * 返回值: 找到的数据 的下标, 如果没找到返回的是 -1
     *      * 查找条件以 return 的形式书写
     * 
     *  6. some
     *      * 语法: 数组.some(function (item, index, origin) {})            三个参数的意义 与 forEach 相同
     *      * 作用: 判断数组内是否有一个满足条件
     *      * 返回值: 一个布尔值    true/false
     *      * 判断条件以 return 的形式书写
     * 
     *  7. every
     *      * 语法: 数组.every(function (item, index, origin) {})            三个参数的意义 与 forEach 相同
     *      * 作用: 判断数组内是否全都满足条件
     *      * 返回值: 一个布尔值    true/false
     *      * 判断条件以 return 的形式书写
     * 
     *  8. reduce
     *      * 语法: 数组.reduce(function (prev, item, index, origin) {}, init)
     *          * prev: 表示初始值或者上一次的运算结果
     *          * item: 表示数组的每一项 的值
     *          * index: 表示数组的每一项 的下标(索引)
     *          * origin: 原始数组
     *      * 作用: 用来实现叠加效果
     *      * 返回值: 最终叠加的结果
     *      * 注意: 
     *              + 叠加条件以 return 的形式书写
     *              + prev 第一次的值, 如果你传递了 init, 就是 init 的值, 如果没有传递 init, 那么就是 数组[0] 的值
     *              + 如果传递了 init, 循环执行 数组.length 次, 如果没有传递 init, 循环执行 数组.length - 1 次

实例

var arr = [100, 200, 300, 400, 500, 600]
    console.log('原始数组: ', arr)
    
  1. forEach

     arr.forEach(function (item, index, origin) {
         console.log(item, index)
         console.log(origin)
     })
    
  2. map

     var newArr = arr.map(function (item, index, origin) {
         // console.log(item, index, origin)
         return item * 2
     })
     var newArr = arr.map(function (item) {
         return item * 2
     })
     console.log('映射出来的数组: ', newArr)
    
  3. filter

       var newArr = arr.filter(function (item, index, origin) {
        return item > 350   // 过滤数组的内容, 只留下 item 大于 350 的成员
     })
     console.log(newArr)
    
  4. find

    var newArr1 = arr.find(function (item, index, origin) {
        return item > 3500   // 在数组中查找第一个符合条件的成员
    })
    console.log(newArr1)
    
  5. findIndex

     var newArr2 = arr.findIndex(function (item, index, origin) {
         return item > 3500
     })
     console.log(newArr2)
     
    

实例

    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    console.log('原始数组: ', arr)
    

6. some

   var bo1 = arr.some(function (item, index, origin) {
        // return item % 2 === 0   // 判断数组内是否有  一个  满足条件的
        return item > 500   // 判断数组内是否有 一个 满足条件的
    })
    console.log(bo1)    // true / false

7. every

    var bo2 = arr.every(function (item, index, origin) {
        // return item % 2 === 0   // 判断数组内 是否  全都    满足条件
        return item > 0     // 判断数组内 是否  全都    满足条件
    })
    console.log(bo2)

    var arr = [1, 2, 3, 4]
    console.log('原始数组: ', arr)
    

8. reduce

    var str = arr.reduce(function (prev, item, index, origin) {
        return prev + item
    }, 0)
    console.log(str)    // 10
     *  在 第 1 轮执行的时候
     *          prev === 0  (因为我使用 reduce 方法的时候传递了 第二个参数, 默认给的值为 0)
     *          item === 1  他的值就是数组第一项的值
     *              在第一轮代码执行的时候, 运行了 return prev + item, 这个结果 会传递给 第二轮循环开始的时候的 prev
     * 
     *  在 第 2 轮执行的时候
     *          prev === 1  (因为上一轮执行了 prev + item   的到的值是 1)
     *          item === 2  因为是第二轮循环, 所以他的值就是数组第二个元素的值
     *              在第二轮代码执行的时候, 运行了 return prev + item,  这个结果会传递给 第三轮循环开始的时候的 prev
     *          
     *  在 第 3 轮执行的时候
     *          prev === 3  (因为上一轮执行了 prev + item 得到的值是 3)
     *          item === 3  因为是第三轮循环, 所以他的值就是数组第三个元素的值
     *              在第三轮代码执行的时候, 运行了 return prev + item, 这个结果会传递给 第四轮循环开始的时候的 prev
     * 
     *  在 第 4 轮执行的时候
     *          prev === 6  (因为上一轮执行了 prev + item 得到的值是 6)
     *          item === 4  因为是第四轮循环, 所以他的值就是数组第四个元素的值
     *              在第四轮代码执行的时候, 运行了 return prev + item, 这个结果会传递给 第五轮循环开始的时候的 prev
     * 
     *  因为后续数组没有元素了, 所以循环到此结束, 然后将 最后一轮 prev 的值 return 出去, 外部可以使用一个变量去接收
      var str = arr.reduce(function (prev, item, index, origin) {
        return prev + item
    })
    console.log(str)    // 10
    *  第 1 轮
     *      prev === 1  (因为没传递 init, 所以 prev 第一次的值是数组下标0位置上的值)
     *      item === 2  (因为没传递 init, 所以 prev 是 下标[0] 的值, 然后 item 就拿到了 下标[1] 的值)
     *          第 1 轮 运行代码 return prev + item     这个结果会传递给 下一轮循环开始时的 prev
     * 
     *  第 2 轮
     *      prev === 3  (因为上一轮执行了 prev + item 得到的值 3)
     *      item === 3  (因为上一轮item的值是[1], 所以本轮的值是 [2])
     *          第 2 轮 运行代码 return prev + item     这个结果会传递给 下一轮循环开始时的 prev
     * 
     *  第 3 轮
     *      prev === 6  (因为上一轮执行了 prev + item 得到的值 6)
     *      item === 4  (因为上一轮item的值是[2], 所以本轮的值是 [3])
     *          第 3 轮 运行代码 return prev + item     这个结果会传递给 下一轮循环开始是的 prev
     * 
     *  因为后续数组没有元素了, 所以循环到此结束, 然后将最后一轮 prev 的值 return 出去, 外部可以使用一个变量去接收
     var arr = [100, 200, 150, 300]
    //          0    1    2    3

    var str = arr.reduce(function (prev, item, index, origin) {
        return prev + item
    })
    console.log(str)    // 750
    *  第 1 轮
     *      prev === 100      (因为没有传递 init, 所以 prev 第一次的值是数组 下标 0 的值)
     *      item === 200          (因为没有传递 init, 所以 prev 的值是 [0], 那么 item 的值就是 [1])
     *          执行代码 return prev + item
     * 
     *  第 2 轮
     *      prev === 300       (因为 上一轮执行了 prev + item 得到的值 300 )
     *      item === 150           (因为上一轮item的值是[1], 所以这一轮是[2])
     *          执行代码 return prev + item
     * 
     *  第 3 轮
     *      prev === 450       (因为上一轮执行了 prev + item 得到的值 450)
     *      item === 300          因为上一轮item的值是 [2], 所以这一轮是[3]
     *          执行代码 return prev + item
     * 
     *  后续数组没有元素了, 循环到此结束, 最终的 prev === 750, 然后将这个 750 return 出去