JS中常见的遍历方法-01

302 阅读4分钟
  • for循环 和 while循环 是普通循环,一般用于 字符串类型、数组类型的遍历
  • for...in...循环用于对象类型的遍历

数组 中forEach,map,filter的区别(只用于数组)

第1种:forEach循环

  • Array.forEach(function (v, i){ }),用于【调用数组】的每个元素,并将元素传递给回调函数原数组不变,不会返回一个新数组,与普通的for 循环一样,但比for循环语句简单

  • 特点:

  • ①forEach():没有返回值,只是针对每个元素调用function,就是将数组中的每个值,依次进行遍历,执行功能函数。
  • ② 需要先创建一个空数组(或其它数据类型)
  • ③ 没有返回值 例如:依次输出数组元素的值

案例:


// 第一种做法:for循环

 let arr = [4, 9, 0, 10, 240, -12, 98]
 let newArr = []
 
 for (let i = 0; i < arr.length; i++) {
            newArr.push(arr[i] + 10)
        }
console.log(arr);      // [4, 9, 0, 10, 240, -12, 98]         **原数组不变**
console.log(newArr);   // [14, 19, 10, 20, 250, -2, 108]    没有返回值,需要新建一个空数组


// 第一种做法:原数组.forEach(function(v,i){ })     v -> value值  i -> 索引

let arr = [4, 9, 0, 10, 240, -12, 98]
let newArr = []

arr.forEach(function (v, i) {
       // v + 10 推入到新数组中 newArr.push()
       newArr.push(v + 10)     })

console.log(arr);  // [4, 9, 0, 10, 240, -12, 98]    **原数组不变**
console.log(newArr);  // [14, 19, 10, 20, 250, -2, 108]  没有返回值,需要新建一个空数组

第2种:map循环

  • Array.map(function (v, i){ }),原数组的每一项执行函数后,返回一个新的数组原数组不变,若是数组对象则会改变

  • 特点:

  • ① map():返回一个新的数组,新数组里每个元素为调用function的结果,就是将每个元素进行function的处理,将处理后的结果作为一个元素放入新的数组。简单的说,【将数组每个元素进行处理,得到处理后的数组】

    ②有返回值

  • 例如 :将数组元素乘以2后的得到新数组

案例

  • [1,2,3,4,5,6] 将原有数组中每一项的数据乘以10返回新数组
  • ['13','3','79','1','10','24','78','2'] 个位数补0返回新数组
  • 遍历数组对象
// [1,2,3,4,5,6] 将原有数组中每一项的数据加10返回新数组   用forEach循环 或map循环都可以操作

// 采用map循环操作

let arr = [1, 2, 3, 4, 5, 6]
let newArr = arr.map(function (v, i) {
            return v * 10
        })

console.log(arr);  // [1, 2, 3, 4, 5, 6]           **原数组不变**
console.log(newArr); // [10, 20, 30, 40, 50, 60]   有返回值


// 第2题:
// ['13','3','79','1','10','24','78','2'] 个位数补0返回新数组
// 需要判断元素是否小于<10后 补0,且此案例中每个元素都是字符串类型

let arr = ['13', '3', '79', '1', '10', '24', '78', '2']

let newArr = arr.map(function (v, i) {
            if (+v < 10) {
                v = '0' + v }
            return v           // 把结果推进newArr中
        })

// 或直接简写为 : return +v < 10 ? '0' + v : v

console.log(arr);  // ['13', '3', '79', '1', '10', '24', '78', '2']
console.log(newArr); // ['13', '03', '79', '01', '10', '24', '78', '02']


// 第3题:遍历数组对象
// 每个对象里年龄都+1
let arr = [{
            name: '李狗蛋',
            age: 16,
            sex: '男'
        }, {
            name: '张翠花',
            age: 20,
            sex: '女'
        }, {
            name: '赵铁柱',
            age: 25,
            sex: '男'
        }, {
            name: '王小二',
            age: 19,
            sex: '男'
        }]


 let newArr = arr.map(function (v, i) {
            // v.age = v.age + 1
            v.age += 1                        // 这里的v指每个对象
            return v
        })
console.log(newArr)
console.log(arr)
// 原数组arr和新数组newArr结果都是一样的 ,因为对象是引用类型,一改则全改
        /*  [{
             name: '李狗蛋',
             age: 17,
             sex: '男'
         }, {
             name: '张翠花',
             age: 21,
             sex: '女'
         }, {
             name: '赵铁柱',
             age: 26,
             sex: '男'
         }, {
                 name: '王小二',
                 age: 20,
                 sex: '男'
             }] */

第3种:filter循环

Array.filter(function(v,i){}),过滤数组中符合条件的元素并返回一个新的数组,常用于【去重、筛选符合某些条件的元素】

特点:①返回一个符合func条件的元素数组 ②将数组中的每个元素进行条件判断【 需要将数组元素按照一定条件进行筛选适用】,符合条件的元素存入新数组中,最后返回新数组

③有返回值

④不会改变原数组

例如:筛选数组中元素值大于60,小于等于100的元素

去重

案例

  • 去掉[13, 0, '', 90, 78, '' , ''] 的空字符串和0值
  • 数组去重 [1,1,2,3,4,4,5,6,6,6,6,7,7,8,9,9,9]
// arr = [13, 0, '', 90, 78, '', ''] 去掉数组中的空字符串和0

let arr = [13, 0, '', 90, 78, '', '']

let newArr = arr.filter(function (v, i) {
          if (v !== '' && v !== 0) {
                return v
            }
            return v
    
  //或 return v !== '' && v !== 0        // return 符合条件的推入新数组的条件->布尔值(过滤)
                
        })

console.log(newArr); // [13, 90, 78]
console.log(arr);   // [13, 0, '', 90, 78, '', '']    //  **原数组不变**


// 第2题:
// 数组去重 [1,1,2,3,4,4,5,6,6,6,6,7,7,8,9,9,9]

let arr=[1,1,2,3,4,4,5,6,6,6,6,7,7,8,9,9,9]
let newArr=arr.filter(function(v,i){
    return arr.indexof(v)===i
})

console.log(arr1);  // [1, 2, 3, 4, 5, 6, 7, 8, 9]

常见案例分析

1.统计字符串 'abcoefoxyozzopp' 中每个字符出现的次数(并封装)

     let str = 'abcoefoxyozzopp'
        function getCount(str) {
            // 将字符串转换为数组
            let arr = str.split('')
            // 声明一个空对象存储各个字符出现的次数 ['a','b','c','0'...]
            let obj = {}       //forEach没有返回值,故需要先创建空对象
            // 对数组进行遍历 v 代表当前遍历项
            arr.forEach(v => {
                // obj[v] 相当于 obj.a  判断如果对象中有指定字符的属性名则在当前数量上加一 
                //否则给对象创建一个新键名
                if (obj[v]) {
                    obj[v] += 1
                } else {
                    obj[v] = 1
                }
            })
        }

console.log(getCount(str))
// {a: 1, b: 1, c: 1, o: 4, e: 1,f: 1,o: 4,p: 2,x: 1,y: 1,z: 2}

2.装一个函数,实现功能:往函数传参为该格式字符串:'get-elements-by-class-name',得到驼峰命名法的返回值为‘getElementsByClassName’(注意:直接在函数中返回‘getElementsByClassName’字符串为0分,需要对相同格式的字符串都能生效)最后封装


        function getName(str) {
            // 1. 将所有的字母都转换为小写
    
            str = str.toLowerCase()
    
            // 2. 将-分隔的字符串转换为数组
            let arr = str.split('-')
    
            let newArr = arr.map(function (v, i) {
                // 如果当前索引不为0 则找到字符串索引为0项转换大写,拼接 剩余字符串
                if (i !== 0) {
                    return v[0].toUpperCase() + v.substr(1)
                }
                return v
            })
    
            // 再将数组转换为字符串
            let newStr = newArr.join('')
    
            return newStr
        }
        console.log(getName(str));

3.有一个url(字符串)如下: www.heima.com?key0=haha&key1=hello&key2=xixi ; 要求处理此url, 得到一个如下格式的对象: let obj = { key0:’haha’, key1:’hello’, key2:’xixi’ }


        //第1步:提取字符串,得到一个新数组
        let arr = url.split('?')  //  ['http://www.heima.com', 'key0=haha&key1=hello&key2=xixi']

        // 第2步:返回删除数组中的第2个元素
        let newStr = arr.pop()   // 'key0=haha&key1=hello&key2=xixi'

        // 第3步:分割数组
        let newArr = newStr.split('&') // ['key0=haha', 'key1=hello', 'key2=xixi']

        // 第4步:遍历每个元素,在进一步分割
        let newArr1 = []

        newArr.forEach(function (v, i) {
            newArr1.push(v.split('='))
        })

        // console.log(newArr1);[['key0', 'haha'], ['key1', 'hello'], ['key2', 'xixi']]

        // 第5步:遍历每个元素,创建一个对象
        let obj = {}

        newArr1.forEach(function (v, i) {
            obj[v[0]] = v[1]
        })
        console.log(obj)  // {key0: 'haha', key1: 'hello', key2: 'xixi'}