JavaScript中多维数组查询对应的值,类似Array.filter方法

450 阅读1分钟

测试数据

let list = [{
    name: '45',
    id: 455,
    children: [
        {
            name: '451',
            id: 4551,
            children: {
                name: '4511',
                id: 455111,
                children: []
            }
        }
    ]
}, {
    name: '46',
    id: 466,
    children: [
        {
            name: '461',
            id: 4661,
            children: {
                name: '4611',
                id: 466111,
                children: []
            }
        }
    ]
}, {
    name: '47',
    id: 477,
    children: [
        {
            name: '471',
            id: 4771,
            children: {
                name: '4711',
                id: 477111,
                children: []
            }
        }
    ]
}, {
    name: '48',
    id: 488,
    children: [
        {
            name: '481',
            id: 4881,
            children: {
                name: '4811',
                id: 488111,
                children: []
            }
        }
    ]
}, {
    name: '49',
    id: 499,
    children: [
        {
            name: '491',
            id: 4991,
            children: {
                name: '4911',
                id: 499111,
                children: []
            }
        }
    ]
}]

封装方法

//封装多维数据查找元素的的方法
function findingMultidimensionalArrays(arrList, value) { // arrList:查找的数组  value:查找的值
    // 第一步 判断是否是数组
    if (Array.isArray(arrList)) {
        let arr = []
        // 第二步判断是否为一般数组或者json数组
        arrList.forEach((item) => {
            if (typeof item === 'object') {
                // 第三步处理多维数据和多维对象数组
                if (Array.isArray(item)) {
                    // 数组
                    const list = findingMultidimensionalArrays(item, value)
                    list.length > 0 && arr.push(...list)
                } else {
                    // 处理json数据
                    const obj = isObjectArray(item, value)
                    //1判断是否为null,2.判断是Array 还是 object
                    if (obj) {
                        if (Array.isArray(obj)) {
                            arr.push(...obj)
                        } else {
                            arr.push(obj)
                        }
                    }
                }
            } else {
                if (item === value) {
                    arr.push(item)
                }
            }
        })
        return arr
    }
}

//递归遍历对象,查找某个属性值
function isObjectArray(item, value) {
    if (item) {
        const keys = Object.keys(item)
        let res = null
        keys.forEach((val) => {
            if (typeof item[val] === 'object') {
                if (Array.isArray(item[val])) {
                    if (item[val].length > 0) {
                        const list = findingMultidimensionalArrays(item[val], value)
                        list && (res = list)
                    }
                } else if (typeof item[val] === 'object') {
                    res = isObjectArray(item[val], value)
                }
            } else {
                item[val] === value && (res = item)
            }
        })
        return res
    }
}

调用方法

const arr = findingMultidimensionalArrays(list, "4811")