我需要从 json 结构创建一个对象。我对如何进行结构的递归感到困惑。
这是我的示例 json 结构
{
"dynamic.title": "Lorem Ipsum title",
"dynamic.main_section.header.title": "Lorem Ipsum main section header title ",
"dynamic.main_section.body.collection.first.title": "Lorem Ipsum main section body collection first title",
"dynamic.main_section.body.collection.first.description": "Lorem Ipsum main section body collection first description",
"dynamic.main_section.body.collection.first.id": "Lorem Ipsum main section body collection first id",
"dynamic.main_section.body.collection.first.child.first.title": "Lorem Ipsum main section body collection first of first child title ",
"dynamic.main_section.body.collection.first.child.first.id": "Lorem Ipsum main section body collection first of first child id ",
"dynamic.main_section.body.collection.first.child.first.url": "https://loremipsum/1",
"dynamic.main_section.body.collection.first.child.first.names.first": "John Doe",
"dynamic.main_section.body.collection.first.child.first.names.second": "Jane Doe",
"dynamic.main_section.body.collection.second.title": "Lorem Ipsum main section body collection second title",
"dynamic.main_section.body.collection.second.description": "Lorem Ipsum main section body collection second description",
"dynamic.main_section.body.collection.second.id": "Lorem Ipsum main section body collection second id",
"dynamic.main_section.body.collection.second.child.first.title": "Lorem Ipsum main section body collection second of first child title ",
"dynamic.main_section.body.collection.second.child.first.id": "Lorem Ipsum main section body collection second of first child id ",
"dynamic.main_section.body.collection.second.child.first.url": "https://loremipsum/2",
"dynamic.main_section.body.collection.second.child.second.title": "Lorem Ipsum main section body collection second of second child title ",
"dynamic.main_section.body.collection.second.child.second.id": "Lorem Ipsum main section body collection second of second child id ",
"dynamic.main_section.body.collection.second.child.second.url": "https://loremipsum/3"
}
我需要的格式是这样的
{
"dynamic": {
"title": "Lorem Ipsum title",
"main_section": {
"header": {
"title": "Lorem Ipsum main section header title "
},
"body": {
"collection": [
{
"title": "Lorem Ipsum main section body collection first title",
"description": "Lorem Ipsum main section body collection first description",
"id": "Lorem Ipsum main section body collection first id",
"child": [
{
"title": "Lorem Ipsum main section body collection first of first child title ",
"id": "Lorem Ipsum main section body collection first of first child id ",
"url": "https://loremipsum/1",
"names": ["John Doe", "Jane Doe"]
}
]
},
{
"title": "Lorem Ipsum main section body collection second title",
"description": "Lorem Ipsum main section body collection second description",
"id": "Lorem Ipsum main section body collection second id",
"child": [
{
"title": "Lorem Ipsum main section body collection second of first child title ",
"id": "Lorem Ipsum main section body collection second of first child id ",
"url": "https://loremipsum/2"
},
{
"title": "Lorem Ipsum main section body collection second of second child title ",
"id": "Lorem Ipsum main section body collection second of second child id ",
"url": "https://loremipsum/3"
}
]
}
]
}
}
}
}
如果左边的键由第一个第二个组成,那么它将是一个数组,但如果存在多个属性,那么它将是一个对象,否则它可能是一个数组。
我如何在 js 中实现这一点?
答案 0 :(得分:2)
您需要将数字替换为索引并检查具有对象或数组的键。
const
setValue = (object, path, value) => {
const
indices = { first: 0, second: 1 },
keys = path.replace(new RegExp(Object.keys(indices).join('|'), 'g'), k => indices[k]).split('.'),
last = keys.pop();
keys
.reduce((o, k, i, kk) => o[k] ??= isFinite(i + 1 in kk ? kk[i + 1] : last) ? [] : {}, object)
[last] = value;
return object;
},
data = { "dynamic.title": "Lorem Ipsum title", "dynamic.main_section.header.title": "Lorem Ipsum main section header title ", "dynamic.main_section.body.collection.first.title": "Lorem Ipsum main section body collection first title", "dynamic.main_section.body.collection.first.description": "Lorem Ipsum main section body collection first description", "dynamic.main_section.body.collection.first.id": "Lorem Ipsum main section body collection first id", "dynamic.main_section.body.collection.first.child.first.title": "Lorem Ipsum main section body collection first of first child title ", "dynamic.main_section.body.collection.first.child.first.id": "Lorem Ipsum main section body collection first of first child id ", "dynamic.main_section.body.collection.first.child.first.url": "https://loremipsum/1", "dynamic.main_section.body.collection.first.child.first.names.first": "John Doe", "dynamic.main_section.body.collection.first.child.first.names.second": "Jane Doe", "dynamic.main_section.body.collection.second.title": "Lorem Ipsum main section body collection second title", "dynamic.main_section.body.collection.second.description": "Lorem Ipsum main section body collection second description", "dynamic.main_section.body.collection.second.id": "Lorem Ipsum main section body collection second id", "dynamic.main_section.body.collection.second.child.first.title": "Lorem Ipsum main section body collection second of first child title ", "dynamic.main_section.body.collection.second.child.first.id": "Lorem Ipsum main section body collection second of first child id ", "dynamic.main_section.body.collection.second.child.first.url": "https://loremipsum/2", "dynamic.main_section.body.collection.second.child.second.title": "Lorem Ipsum main section body collection second of second child title ", "dynamic.main_section.body.collection.second.child.second.id": "Lorem Ipsum main section body collection second of second child id ", "dynamic.main_section.body.collection.second.child.second.url": "https://loremipsum/3" },
result = Object
.entries(data)
.reduce((r, [k, v]) => setValue(r, k, v), {});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:0)
我向您展示了转换数据的方法,以便您继续使用它,甚至在必要时实现自动化;
let data = {
"dynamic.title": "Lorem Ipsum title",
"dynamic.main_section.header.title": "Lorem Ipsum main section header title ",
"dynamic.main_section.body.collection.first.title": "Lorem Ipsum main section body collection first title"
}
dataTrans = {}
//data["dynamic.title"]
dataTrans.dynamic = {}
dataTrans.dynamic.title = data["dynamic.title"]
//data["dynamic.main_section.header.title"]
dataTrans.dynamic.main_section = {}
dataTrans.dynamic.main_section.header = {}
dataTrans.dynamic.main_section.header.title = data["dynamic.main_section.header.title"]
dataTrans.dynamic.main_section.body = {}
dataTrans.dynamic.main_section.body.collection = []
dataTrans.dynamic.main_section.body.collection[0] = {}
dataTrans.dynamic.main_section.body.collection[0].title = data["dynamic.main_section.body.collection.first.title"]
console.log(dataTrans)