javascript - 将所需数据转换为具有嵌套对象的对象,其中包含键和值
问题描述
我有以下数据结构。我需要获得所需的动态输出,如下所示。
我尝试使用递归函数,因为预期的结构如下是递归的,但是我怎样才能将其作为键值呢?
有没有更好的方法来实现这一目标?
输入数据
let data = {
users: [
{
terms: ["service|/users"],
conditions: ["view", 'create']
},
{
terms: ["service|/users-details"],
conditions: ["view"]
},
{
terms: ["service|/usersNew"],
conditions: ["view"]
},
{
terms: ["list|searchuser"],
conditions: ["view"]
},
{
terms: ["list|createuser"],
conditions: ["view", "create"]
},
{
terms: ["service|/user-contacts"],
conditions: ["view"]
},
{
terms: ["service|/user-location"],
conditions: ["view"]
},
{
terms: ["searchuserslist|button|select-button"],
conditions: ["enable"]
}
]
};
预期产出
{
list: [{ searchuser: ["view"] }, { createuser: ["view", "create"] }],
service: [{/users: ['view', 'create']}, {/users-details: ['view']}, {/usersNew: ['view']}, {/user-contacts: ['view']}, {/user-location: ['view']}]
searchuserslist: {
button: [{select-button: ['enable']}]
}
}
我试过的片段
function resolvingData(data, object = {}) {
return data.reduce((result, string) => {
const [key, value] = string.split(/\|(.+)/);
if (value && value.includes("|")) {
result[key] = result[key] || {};
resolvingData([value], result[key]);
} else {
result[key] = result[key] || [];
result[key].push(value);
}
return result;
}, object);
}
解决方案
我认为这会起作用:
let data = {
users: [
{
terms: ["service|/users"],
conditions: ["view", 'create']
},
{
terms: ["service|/users-details"],
conditions: ["view"]
},
{
terms: ["service|/usersNew"],
conditions: ["view"]
},
{
terms: ["list|searchuser"],
conditions: ["view"]
},
{
terms: ["list|createuser"],
conditions: ["view", "create"]
},
{
terms: ["service|/user-contacts"],
conditions: ["view"]
},
{
terms: ["service|/user-location"],
conditions: ["view"]
},
{
terms: ["searchuserslist|button|select-button"],
conditions: ["enable"]
}
]
};
var obj = {
list: [],
service: [],
searchuserslist: {
button: []
}
}
var arr = data.users;
arr.map((element) => {
if(element.terms[0].indexOf('list') > -1){
var ch = element.terms[0].indexOf('|');
var sl = element.terms[0].slice(ch+1)
obj.list[sl] = element.conditions.map((ele) => ele)
}
if(element.terms[0].indexOf('service') > -1){
var ch = element.terms[0].indexOf('|');
var sl = element.terms[0].slice(ch+1)
obj.service[sl] = element.conditions.map((ele) => ele)
}
if(element.terms[0].indexOf('searchuserslist') > -1){
var ch = element.terms[0].indexOf('|');
var sl = element.terms[0].slice(ch+1)
obj.searchuserslist.button[sl] = element.conditions.map((ele) => ele)
}
})
推荐阅读
- r - 在 R Rstudio 中找不到 libR.so
- oracle - 如何从特定客户不存在的表中提取记录?
- c# - 如何以特定的并行度并行化多个异构作业
- python - 如何将两个不同类型的输入放在一行中?
- javascript - 即使上下文没有任何变化,也反应重新渲染
- php - 如果数据通过 rasberrypie 以 urlencode 格式发布,我们如何打印个人数据
- javascript - 可以从 React-Router 的 HashRouter 历史记录中删除路由吗?
- android - 约束布局 0dp 不适用于 Android 视图绑定
- javascript - 护照认证或JWT认证。哪一个更好?
- windows - 在循环中计算 hh:mm:ss