想了一个面试题:树的过滤

给候选人做的题,应该好理解,如果讲半天题目,对方都不理解,我都怀疑是不是我的表达能力不行。题目足够简单,我讲解题目也省事,对方不理解或者不能做出来,则淘汰就好,我心里也没有负担。

有一个对象如下:

let tree = {
    a: {
        b: {
            c: '2',
            f: '3',
            z: {
                s: '3'
            }
        }
    },
    d: {
        c: '2'
    }
}

实现一个函数,我们要把叶子节点为 3 的对象过滤出来,得到如下对象:

{
    "a": {
        "b": {
            "f": "3",
            "z": {
                "s": "3"
            }
        }
    }
}

该怎么实现这个函数呢?

let tree = {
    a: {
        b: {
            c: '2',
            f: '3',
            z: {
                s: '3'
            }
        }
    },
    d: {
        c: '2'
    }
}

function fn(obj, filters=[]) {
    let res = Object.create(null)

    if (typeof obj !== 'object') {
        return filters.includes(obj)
    }

    let flag = false

    for (let k in obj) {
        let exist = fn(obj[k], filters)
        if (!exist)
            continue

        flag = true

        if (typeof exist === 'object') {
            res[k] = exist
        } else {
            res[k] = obj[k]
        }

    }
    return flag ? res : false
}

console.log(fn(tree, ['3']))

作者: 曾小乱

喜欢写点有意思的东西

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注