我正在尝试从现有对象创建新的对象结构。
当前数据集如下:
const jsonStructure = {
"a11/a22/animations": "snimations",
"a11/a22/colours": "sl/colours",
"a11/a22/fonts": "sbal/fonts",
"a11/a22/visibility": "sisibility",
"a11/b22/logo": "sages/logo",
"a11/c22/define": "sst/define",
"a11/c22/ordered": "st/ordered",
"a11/c22/unordered": "sunordered",
"a11/d22/foot": "smeta/foot",
"a11/d22/head": "smeta/head",
"a11/e22/blockquote": "slockquote",
"a11/e22/headings": "s/headings",
"a11/e22/hr": "ss/e/hr",
"a11/e22/inline-elements": "s-elements",
"a11/e22/paragraph": "sparagraph",
"a11/e22/preformatted": "sformatted",
"a11/e22/time": "stext/time",
"b11/f22/menu": "smenu/menu",
"b11/g22/product-item": "sduct-item",
"b11/h22/search": "sch/search",
"b11/i22/sub-menu": "s/sub-menu",
"c11/j22/footer": "ser/footer",
"c11/j22/title": "ster/title",
"c11/k22/header": "ser/header"
};
我要实现的是一种数据结构:
{
"a11": {
"a22": {
"animations": {
"value": "snimations"
},
"colours": {
"value": "sl/colours"
}
},
"b22": {
"logo":{
"value": "sbal/fonts"
}
}
"c22": {
"define":{
"value": "sst/define"
},
"ordered":{
"value": "st/ordered"
}
}
},
"b11": {
"f22": {
"menu": {
"value": "smenu/menu"
}
},
}
}
问题是我构建代码的方式似乎是错误的,或者可以用更好的方式编写。无论哪种方式,我都始终无法添加对象的分段和创建。
const structure = {
a: {},
b: {},
c: {}
};
let a11 = [];
let b11 = [];
let c11 = [];
for (var hbp in jsonStructure) {
if (hbp.includes("a11")) {
}
if (hbp.includes("b11")) {
}
if (hbp.includes("c11")) {
}
}
答案 0 :(得分:2)
您可以使用函数将路径拆分为值并为其生成新对象。
var input = { "a11/a22/animations": "snimations", "a11/a22/colours": "sl/colours", "a11/a22/fonts": "sbal/fonts", "a11/a22/visibility": "sisibility", "a11/b22/logo": "sages/logo", "a11/c22/define": "sst/define", "a11/c22/ordered": "st/ordered", "a11/c22/unordered": "sunordered", "a11/d22/foot": "smeta/foot", "a11/d22/head": "smeta/head", "a11/e22/blockquote": "slockquote", "a11/e22/headings": "s/headings", "a11/e22/hr": "ss/e/hr", "a11/e22/inline-elements": "s-elements", "a11/e22/paragraph": "sparagraph", "a11/e22/preformatted": "sformatted", "a11/e22/time": "stext/time", "b11/f22/menu": "smenu/menu", "b11/g22/product-item": "sduct-item", "b11/h22/search": "sch/search", "b11/i22/sub-menu": "s/sub-menu", "c11/j22/footer": "ser/footer", "c11/j22/title": "ster/title", "c11/k22/header": "ser/header" },
output = {};
Object
.entries(input)
.forEach(([k, v]) =>
k.split('/').reduce((o, k) => o[k] = o[k] || {}, output).value = v);
console.log(output);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:1)
您可以使用.split
获取所有路径并建立嵌套对象:
const result = {};
for(const [key, value] of Object.entries(jsonStructure)) {
let acc = result;
for(const path of key.split("/"))
acc = (acc[path] || (acc[path] = {}));
acc.value = value;
}
答案 2 :(得分:0)
遍历输入对象的entries
,使用嵌套的reduce
在累加器中标识(并在必要时创建)嵌套对象,然后将其分配给其value
属性:
const jsonStructure={"a11/a22/animations":"snimations","a11/a22/colours":"sl/colours","a11/a22/fonts":"sbal/fonts","a11/a22/visibility":"sisibility","a11/b22/logo":"sages/logo","a11/c22/define":"sst/define","a11/c22/ordered":"st/ordered","a11/c22/unordered":"sunordered","a11/d22/foot":"smeta/foot","a11/d22/head":"smeta/head","a11/e22/blockquote":"slockquote","a11/e22/headings":"s/headings","a11/e22/hr":"ss/e/hr","a11/e22/inline-elements":"s-elements","a11/e22/paragraph":"sparagraph","a11/e22/preformatted":"sformatted","a11/e22/time":"stext/time","b11/f22/menu":"smenu/menu","b11/g22/product-item":"sduct-item","b11/h22/search":"sch/search","b11/i22/sub-menu":"s/sub-menu","c11/j22/footer":"ser/footer","c11/j22/title":"ster/title","c11/k22/header":"ser/header"}
const output = Object.entries(jsonStructure).reduce((a, [keysStr, val]) => {
const keys = keysStr.split('/');
const finalObj = keys.reduce((nestedObj, key) => {
if (!nestedObj[key]) nestedObj[key] = {};
return nestedObj[key];
}, a);
finalObj.value = val;
return a;
}, {});
console.log(output);
答案 3 :(得分:0)
这里的其他答案很好,不需要外部软件包即可为您提供解决方案。但是,可能值得引起您注意的是npm上的flat软件包,该软件包可用于展开对象。 在这种情况下,您需要将定界符设置为“ /”:
var unflatten = require('flat').unflatten
unflatten(yourObject, { delimiter: '/' })