Node.js перебирает ключи ключа объекта - PullRequest
0 голосов
/ 26 июня 2018

Хорошо, я знаю, что название немного сбивает с толку (может быть, много), поэтому позвольте мне объяснить. В такой переменной типа 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' из полей userKeys. Как я могу сделать это, перебирая не только ключи от базовой структуры, но и ключи внутри объекта, который находится внутри другого объекта? Я пытался сделать это с

Object.keys(user.userKeys).forEach((key) => {
    const cur = user[key];
    if (typeof cur === Object) {
        Object.keys(user.userKeys[key]).forEach((ok) => {
            console.log(ok, user.userKeys[ok].show);
            myObj.push(cur);
        });
    }
});

но он не будет регистрировать что-либо, что является частью Объекта (например: profile.name или profile.country).

Я ценю любые советы.

Хорошего дня

1 Ответ

0 голосов
/ 26 июня 2018

Вы можете сделать простую функцию, которая берет объект и просматривает каждую клавишу, чтобы увидеть, есть ли 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...