对象转换为同一级别的对象数组(展平并在每个级别上求和]"/>
将格式化的json对象转换为同一级别的对象数组(展平并在每个级别上求和]
具有以下树json对象:
{
"Season1": {
"Title1": {
"a1": {
"val1": "100",
"val2": "200",
"val3": "300"
},
"a2": {
"val1": "100",
"val2": "200",
"val3": "300"
}
},
"Title2": {
"c1": {
"val1": "100",
"val2": "200",
"val3": "300"
},
"d2": {
"val1": "100",
"val2": "200",
"val3": "300"
}
}
}
}
试图使用以下功能格式化json:
function Format(obj){
return Object.entries(obj).flatMap(([key, val]) => {
let o = { name: key}
if(Object.keys(val).some(function(k) {return typeof val[k] === 'object'})){
o['_children'] = Format(val)
} else {
Object.keys(val).map(function(a){
o[a] = val[a]
})
}
return [o]
})
}
这将通过键返回嵌套对象的数组:
[
{
"name": "Season1",
"_children": [
{
"name": "Title1",
"_children": [
{
"name": "a1",
"val1": "100",
"val2": "200",
"val3": "300"
},
{
"name": "a2",
"val1": "100",
"val2": "200",
"val3": "300"
}
]
},
{
"name": "Title2",
"_children": [
{
"name": "c1",
"val1": "100",
"val2": "200",
"val3": "300"
},
{
"name": "d2",
"val1": "100",
"val2": "200",
"val3": "300"
}
]
}
]
}
]
挑战是计算将它们置于相同级别,并递归地在每个父级别中添加最低级别键的小计,分别是val1,val2,val3,例如因此,“ Title1”,“ Title2”和“ Season1”在将输出填充到表中之后可以填充空白的小计单元格。子级别应根据级别的深度缩进4 white space。预期的输出应如下所示:
[
{"name": "Season1", "val1": 600, "val2": 800, "val3": 1200},
{"name": " Title1", "val1": 200, "val2": 400, "val3": 600},
{"name": " a1", "val1": "100", "val2": "200", "val3": "300"},
{"name": " a2", "val1": "100", "val2": "200","val3": "300"},
{"name": " Title2","val1": 400, "val2": 400, "val3": 600},
{"name": " c1", "val1": "100", "val2": "200", "val3": "300"},
{"name": " d2", "val1": "100", "val2": "200", "val3": "300"},
]
如何为此目的更新格式功能?有人可以分享任何想法或解决方案吗?谢谢!
回答如下:尝试一下是否可行!解释代码可能有些棘手。
我在代码的相关部分添加了一些注释。
var data = {
Season1: {
Title1: {
a1: {
val1: "100",
val2: "150",
val3: "100"
},
a2: {
val1: "100",
val2: "200",
val3: "300"
}
},
Title2: {
c1: {
val1: "100",
val2: "200",
val3: "300"
},
d2: {
val1: "100",
val2: "200",
val3: "300"
}
}
},
Season2: {
Title1: {
a1: {
val1: "100",
val2: "200",
val3: "300"
},
a2: {
val1: "100",
val2: "200",
val3: "300"
}
},
Title2: {
c1: {
val1: "100",
val2: "200",
val3: "300"
},
d2: {
val1: "100",
val2: "200",
val3: "300"
}
}
}
};
function Format(obj, depth = 0) {
return Object.entries(obj).flatMap(([key, val]) => {
if (
Object.keys(val).some(function(k) {
return typeof val[k] === "object";
})
) {
// Pad keys with spaces based on depth
let o = {
name: key.padStart(depth * 4 + key.length)
};
const children = Format(val, depth + 1);
// Get the sum of children that are only only one level deep
const childrenSum = children
.filter(
({
name
}) =>
name.length - name.replace(/\s/g, "").length === (depth + 1) * 4
)
// Filter out the name key as they are not numbers
.reduce((acc, temp) => {
Object.entries(temp)
.filter(([key, val]) => key !== "name")
.forEach(([key, val]) => {
acc[key] = (acc[key] || 0) + Number(val);
});
return acc;
}, {});
o = { ...o,
...childrenSum
};
return [o, ...children];
} else {
let o = {
name: key.padStart(depth * 4 + key.length)
};
Object.keys(val).map(function(a) {
o[a] = val[a];
});
return [o];
}
});
}
console.log(Format(data));
更多推荐
将格式化的json对象转换为同一级别的对象数组(展平并在每个级别上求和]
发布评论