遍历对象并删除容器

时间:2019-06-29 09:22:02

标签: javascript object json-api

我正在使用JSON API规范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 个答案:

答案 0 :(得分:1)

使用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))

希望获得帮助。

答案 1 :(得分:1)

您可以通过检查嵌套值并过滤掉此键/值对来删除不需要的属性。然后建立一个新对象。

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; }