我正在使用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
对象。
答案 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; }