Javascript 按键将格式化的json对象转换为对象数组,并在每个级别进行汇总

Javascript 按键将格式化的json对象转换为对象数组,并在每个级别进行汇总,javascript,node.js,Javascript,Node.js,具有以下树json对象: { "Season1": { "Title1": { "a1": { "val1": "100", "val2": "200", "val3": "300" }, "a2": { "val1": "100", "val2": "200", "val3": "300" } }, "Title2": {

具有以下树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。“TITLE 1”、“TITLE 2”和“SATON1”,因此在将输出填充到表中之后,可以填充空白子总体单元。预期输出应如下所示:

[
  {
    "name": "Season1",
    "_children": [
      {
        "name": "Title1",
        "_children": [
          {
            "name": "a1",
            "val1": "100",
            "val2": "200",
            "val3": "300",
          },
          {
            "name": "a2",
            "val1": "100",
            "val2": "200",
            "val3": "300",
          }
        ],
        "val1": 200,
        "val2": 400,
        "val3": 600
      },
      {
        "name": "Title2",
        "_children": [
          {
            "name": "c1",
            "val1": "100",
            "val2": "200",
            "val3": "300",
          },
          {
            "name": "d2",
            "val1": "100",
            "val2": "200",
            "val3": "300",
          }
        ],
        "val1": 400,
        "val2": 400,
        "val3": 600
      }
    ],
    "val1": 600,
    "val2": 800,
    "val3": 1200
  }
]

如何为此更新Format函数?有人能分享一些想法或解决方案吗?谢谢

您可以更新所有级别,但最嵌套的级别除外

函数和(数组,和={}){
var更新;
array.forEach(o=>{
如果(!o._儿童){
求和[o.name]=(求和[o.name]| | 0)++o.value;
回来
}
变量x={}
求和(o,x)和对象赋值(o,x);
Object.keys(x).forEach(k=>sums[k]=(sums[k]| | 0)+x[k]);
更新=真;
});
返回更新;
}
var数据=[{name:“季节1”,{u子项:[{name:“Title1”,{u子项:[{name:“a1”,{u子项:[{name:“val1”,value:“100”},{name:“val2”,value:“200”},{name:“val3”,value:“300”},{name:“a2”,{name:“val1”,value:“150”},{name:“val2”,value:“260”},{name:“val3”,value:“370},{name:“Title2”,{name:“c1”,{u子项:[{name:“val1”,value:“110”},{name:“val2”,value:“220”},{name:“val3”,value:“330”},{name:“d2”,{u子项:[{name:“val1”,value:“101”},{name:“val2”,value:“202”},{name:“val3”,value:“303}]}];
总和(数据);
控制台日志(数据)

。作为控制台包装{max height:100%!important;top:0;}
您还可以像下面这样编辑递归函数。我在递归的每一级累积总和,并将其传递给调用堆栈

数据={
第一季:{
标题1:{
a1:{
val1:“100”,
val2:“200”,
val3:“300”
},
a2:{
val1:“100”,
val2:“200”,
val3:“300”
}
},
标题2:{
c1:{
val1:“100”,
val2:“200”,
val3:“300”
},
d2:{
val1:“300”,
val2:“200”,
val3:“300”
}
}
}
};
函数合并(srcObj、destObj){
key(srcObj).forEach(key=>{
if(destObj[键]){
destObj[key]=destObj[key]+srcObj[key]
}
否则{
destObj[key]=srcObj[key];
}
});
返回destObj;
}
函数格式(obj,valObj={},level=0){
valObj[level]={};
返回Object.entries(obj.flatMap)([key,val])=>{
设o={name:key};
if(typeof val==“对象”){
o[“_children”]=格式(val、valObj、级别+1);
valObj[level]=合并(valObj[level+1],valObj[level]|{});

如果(level thanking@nithin,那么解决方案是有效的。后来我更新了函数格式()在使底层更整洁的问题中,该问题删除了底部的_children对象,并直接将键值对与名称放在一起。我试图修改您的解决方案,但在Format函数更改后无法使其工作,您能帮助建议如何操作吗?@ctlkkc没问题。我已调整代码以使用新的Format函数n、 请检查更新的答案。如果这有帮助,请标记正确答案/向上投票:)。你好:)谢谢。@nithin你能帮我回答类似的问题吗?谢谢。