最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

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

网站源码admin28浏览0评论

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

将格式化的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));
发布评论

评论列表(0)

  1. 暂无评论