Node.js遍历对象键的键

时间:2018-06-26 17:22:12

标签: node.js object

好,所以我知道标题有点混乱(也许很多),所以让我解释一下。在像猫鼬模式这样的Object变量中,可以有String,Number,Boolean等类型。但是如果类型是新的Object怎么办?那个对象里面还有另一个对象怎么办?

比方说我在这里得到了这个模式:

user: {
    username: 'bob1',
    password: '1234',
    email: 'someone@example.com',
    profile: {
        name: {
            first: 'Bob',
            last: 'Marley'
        },
        gender: 'male',
        country: 'US'
    },
    userKeys: {
        username: { show: true },
        password: { show: false },
        email: { show: 'maybe' },
        profile: {
            name: {
                first: { show: true },
                last: { show: true }
            },
            gender: { show: false },
            country: { show: 'maybe' }
        }
    }
}

,我想基于该用户的userKeys在文件中创建一个新的临时对象,该模式仅返回来自模式{true'maybe'的值1}}字段。如何通过不仅迭代基本结构中的键,而且还迭代另一个对象内的对象内的键来做到这一点?我尝试用

userKeys

,但不会记录对象对象的任何内容(例如:profile.name或profile.country)。

我感谢任何提示。

祝你愉快

1 个答案:

答案 0 :(得分:0)

您可以创建一个简单的函数,该函数接受一个对象并查看每个键以查看是否存在show: true或将每个键添加到数组中。然后,对于您查看的每个对象,将其递归地传递回函数中。这是一个非常简洁的解决方案:

let object = {user: {username: 'bob1',password: '1234',email: 'someone@example.com',profile: {name: {first: 'Bob',last: 'Marley'},gender: 'male',country: 'US'},userKeys: {username: { show: true },password: { show: false },email: { show: 'maybe' },profile: {name: {first: { show: true },last: { show: true }},gender: { show: false },country: { show: 'maybe' }}}}}

function getTrueKeys(obj, res = []) {
    Object.keys(obj).forEach(k => {
        if (obj[k].show && (obj[k].show === true || obj[k].show === 'maybe')) res.push(k)
        if (typeof obj[k] === 'object') getTrueKeys(obj[k], res)
    })
    return res
}

console.log(getTrueKeys(object.user.userKeys))