Перебрать объект и удалить пустые - PullRequest
2 голосов
/ 29 июня 2019

Я использую JSON API spec API v1.1. Я делаю это своим внешним интерфейсом, однако натолкнулся на небольшую проблему, когда пытался вернуть отношения обратно.

По сути, я отправляю тот же объект обратно и изменяю то, что мне нужно.

Это пример того, как я это делаю:

{
    ...originalUser,
    attributes: {
        ...originalUser,
        lastName: 'Doe'
    }
}

Это все работает нормально, если originalUser не имеет отношения, который является полностью пустым. Я знаю, что могу сделать delete originalUser.relationships.relationship, который удалит свойство из объекта, но это могут быть любые отношения, а также отношения могут иметь такие запутанные отношения, как это звучит.

Из-за этого я знаю, что мне нужно рекурсивно пройти через объект и удалить любой пустой объект, который я боюсь сказать, что понятия не имею, как это сделать, так как мне нужно будет вызвать метод, у меня есть грубая идея, и это было бы что-то вроде ...

protected removeEmptyRelationships(obj) {
    return Object.keys(obj).filter((el) => {
        return el.hasOwnProperty('data');
    });
}

Пример запроса, который я могу отправить

{
    id: '1',
    type: 'users',
    attributes: {
        firstName: 'John',
        lastName: 'Doe'
    },
    relationships: {
        role: {
            data: {
                type: 'roles',
                id: '1'
            }
        },
        group: {
            data: {
                type: 'groups',
                id: '1',
                relationships: {
                    policy: {}
                }
            }
        },
        type: {}
    }
}

Так, в приведенном выше примере я хотел бы удалить relationships.type, а также relationships.group.relationships.policy. Очевидно, как было сказано ранее, это нужно будет удалить программно, так как я не знаю, что это за объект, который мне нужно удалить.

Еще одна вещь, на которую я хотел бы обратить внимание: если внутри отношений нет ключей после удаления пустых, просто удалите весь объект relationships.

Ответы [ 2 ]

1 голос
/ 29 июня 2019

Вы можете удалить нежелательные свойства, проверив вложенные значения и отфильтровав эти пары ключ / значение. Затем создайте новый объект.

function clean(object) {
    return Object.fromEntries(Object
        .entries(object)
        .map(([k, v]) => {
            if (v && typeof v === 'object') {
                v = clean(v);
                if (!Object.keys(v).length) return;
            }
            return [k, v];
        })
        .filter(Boolean)
    );
}

var data = { id: '1', type: 'users', attributes: { firstName: 'John', lastName: 'Doe' }, relationships: { role: { data: { type: 'roles', id: '1' } }, group: { data: { type: 'groups', id: '1', relationships: { policy: {} } } }, type: {} } },
    result = clean(data);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 29 июня 2019

Вы можете сделать это очень просто, работая с object как string и используя регулярные выражения .пытаться:

const obj = {
    id: '1',
    type: 'users',
    attributes: {
        firstName: 'John',
        lastName: 'Doe'
    },
    relationships: {
        role: {
            data: {
                type: 'roles',
                id: '1'
            }
        },
        group: {
            data: {
                type: 'groups',
                id: '1',
                relationships: {
                    policy: {}
                }
            }
        },
        type: {}
    }
}


const exp = /"\w*":{}/g;
const exp2 = /,}/g;
let strObj = JSON.stringify(obj);

while(exp.test(strObj)) {
    strObj = strObj.replace(exp,'');
}

strObj = strObj.replace(exp2, '}');
console.log(JSON.parse(strObj))

Надеюсь, эта помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...