将格式化的json对象转换为同一级别的对象数组(展平并在每个级别上求和]

编程入门 行业动态 更新时间:2024-10-08 00:28:26

将格式化的json<a href=https://www.elefans.com/category/jswz/34/1771306.html style=对象转换为同一级别的对象数组(展平并在每个级别上求和]"/>

将格式化的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对象转换为同一级别的对象数组(展平并在每个级别上求和]

本文发布于:2024-05-06 21:05:20,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1753845.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:对象   并在   数组   转换为   级别

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!