数组的一些方法和树形结构

113 阅读4分钟

JavaScript 数组遍历方法的对比

一些数组的遍历方法

for

for循环是最传统的语句,定义一个变量i为索引,用来遍历找到位置

var arr = [1, 2, 3, 4]
for(var i = 0, length = arr.length; i < length; i++){
    console.log(arr[i])
}
// 得到: 1  2  3  4

forEach

是一个数组方法,把一个函数套用在一个数组中的每个元素上,为每个数组元素执行callback函数,只能用于数组,遍历一个数组让数组每个元素做一件事情

var arr = [1, 2, 3, 4]
arr.forEach(function(item) {
    console.log(item);
})
// 得到: 1  2  3  4

for in

一般会用for in来遍历对象属性的,使用for in会遍历数组所有的可枚举属性,包括原型,如果不想遍历原型方法和属性的话,可以在循环内部判断一下

var obj = {
    name: 'zs',
    age: 20,
    height: 185,
    like: 'apple'
}
for (var key in obj) {
    console.log(obj[key])
}
// 得到: zs  20  185  apple

filter

filter是一个内置的数组迭代方法,它接受一个(指代一个过滤条件的函数),该“函数”针对每个值进行调用,并返回一个符合该条件的数组。

var arr = [1, 2, 3, 4, 5, 6]
    var newArr = arr.filter(function (number) {
    // 条件:大于 2 的数
        return number > 2
    })
    console.log(newArr);
// 得到:[4, 5, 6]

map

map接收两个参数:callback 函数,会在 map 执行之后被触发。map 会返回一个新数组,如果你想基于一个原数组返回一个新数组,可以选择map

var arr = [1, 2, 3]
    // 计算: 数组里每一项乘 2 
    var newArr = arr.map(a => a * 2)
    console.log(newArr);
// 得到: 2  4  6

练习题

一、

var arr = [{ label: '男', value: 1 }, { label: '女', value: 0 }]
需求: {value:label}

function f(arr) {
        const newObj = {} // 创建一个新对象存数据
        // forEach方法循环数组,毁掉函数中的参数代表数组中的每一项
        arr.forEach(obj => {
            newObj[obj.value] = obj.label
        })
    }
    var obj = f(arr);
    console.log(obj)
// 得到: {0: '女', 1: '男'}

二、

var arr = [{ label: '男', value: 1 }, { label: '女', value: 0 }]
需求: arr2 = ['男', '女']

// 方法一:
    function fn(arr) {
        // 写代码,得到
        return arr.map(obj => { // 回调函数中的参数代表数组中的每一项
            return obj.label // 将每一项中的label值返回
        })

    }

    // 方法二:
    // function fn(arr) {
    //     // 写代码,得到
    //     const newArr = []  // 创建一个新数组
    //     arr.forEach(obj => { // forEach 遍历数组
    //         newArr.push(obj.label) // 将原数组中的每一个label值添加到新数组中
    //     })
    //     return newArr

    // }
    var arr2 = fn(arr);
    console.log(arr2)
// 得到:['男', '女'] 

三、

pid为同级职位,pid为空""是第一级职位, "01"为第二级别,以此类推....

var data = [
        { id: "01", name: "张大大", pid: "", job: "项目经理" },
        { id: "02", name: "小亮", pid: "01", job: "产品leader" },
        { id: "03", name: "小美", pid: "01", job: "UIleader" },
        { id: "04", name: "老马", pid: "01", job: "技术leader" },
        { id: "05", name: "老王", pid: "01", job: "测试leader" },
        { id: "06", name: "老李", pid: "01", job: "运维leader" },
        { id: "07", name: "小丽", pid: "02", job: "产品经理" },
        { id: "08", name: "大光", pid: "02", job: "产品经理" },
        { id: "09", name: "小高", pid: "03", job: "UI设计师" },
        { id: "10", name: "小刘", pid: "04", job: "前端工程师" },
        { id: "11", name: "小华", pid: "04", job: "后端工程师" },
        { id: "12", name: "小李", pid: "04", job: "后端工程师" },
        { id: "13", name: "小赵", pid: "05", job: "测试工程师" },
        { id: "14", name: "小强", pid: "05", job: "测试工程师" },
        { id: "15", name: "小涛", pid: "06", job: "运维工程师" }
    ]

需求1. 返回一个数组, 找出与 小刘 处于统一领导下的同事(同事以对象形式填入数组中)

function fn(data, name) {
        // 完成代码
        const ind = data.findIndex(obj => {
            return obj.name === name
        })
        const pid = data[ind].pid
        const newArr = data.filter(obj => {
            return obj.pid === pid
        })
        return newArr
    }
    var newArr = fn(data, '小刘')
    console.log(newArr) 
    
// 得到:
//  [{id:"10", name: "小刘", pid:"04", job: "前端工程师"},
//  {id:"11", name: "小华", pid:"04", job: "后端工程师"},
//  {id:"12", name: "小李", pid:"04", job: "后端工程师"}]

需求2. 找出 小亮 的所有下属 (下属以对象形式)

function fn2(data, name) {
        // 完成代码
        const newArr = []
        data.forEach(obj => {
            if (obj.name === name) {
                let id = obj.id
                data.forEach(obj => {
                    if (obj.pid === id) {
                        newArr.push(obj)
                    }
                })
            }
        })
        return newArr
    }
    const arr = fn2(data, '小亮')
    console.log(arr) 
// 得到: 
// {id:"07", name: "小丽", pid:"02", job: "产品经理"},
// {id:"08", name: "大光", pid:"02", job: "产品经理"},

四、

var obj = { label: '男', value: 1, age: 18 }
需求: arr = ['男', '1', '18']

function fn(obj) {
        // 写代码位置
        let arr = []
        for (key in obj){
            arr.push(obj[key])
        }
        return arr
    }
    var arr = fn(obj);
    console.log(arr) // 所有的属性值取出来,保存在数组中
// 得到: ['男', '1', '18']
  • 如有做的不好的地方,欢迎大家指出,下面是小巨人的仓库地址:

gitee.com/du-shangqin…