简体   繁体   English

从复杂的 json 结构中获取最后一个子节点,并仅重构 javascript 中的最后一个节点

[英]Get the last child node from complex json like structure and restructure only the last node in javascript

I need to change the structure of complex json like structure consists of objects and arrays.我需要更改复杂的 json 结构,该结构由对象和 arrays 组成。 Let's say the original object is dataObj假设原来的 object 是dataObj

const dataObj = {
  name: "flare",
  children: [
    {
      name: "analytics",
      desc : "A",
      children: [
        {
          name: "cluster",
          desc : "AB",
          children: [
            { 
              name: "AgglomerativeCluster",
              desc : "ABC",
              value: 3938,
              count:39 
            }, 
            { 
              name: "CommunityStructure",
              desc : "ABCD", 
              value: 3812,
              count:38
            },
          ]
        },
        {
          name: "graph",
          desc : "ABCDE",
          children: [
            { 
              name: "BetweennessCentrality",
              desc : "AHF", 
              value: 3534,
              count:39
            },
            { 
              name: "LinkDistance",
              desc : "AmH", 
              value: 5731,
              count:39 
            },
          ]
        },
        {
          name: "optimization",
          desc : "Ashg",
          children: [
            { 
              name: "AspectRatioBanker",
              desc : "Avnvs", 
              value: 7074,
              count:39 
            }
          ]
        }
      ]
    },
    {
      name: "animate",
      desc : "Amvs",
      children: [
        { 
          name: "Easing",
          desc : "Amnvs", 
          value: 17010,
          count:39 
        },
        { 
          name: "FunctionSequence",
          desc : "Abnvs", 
          value: 5842 ,
          count:39
        },
      ]
    },
  ]
};

I need to get the last child node which consists of keys "value" and "count" for eg:我需要获取由键“value”和“count”组成的最后一个子节点,例如:

children: [
  { 
    name: "AgglomerativeCluster",
    desc : "ABC",
    value: 3938,
    count:39 
  }, 
  { 
    name: "CommunityStructure",
    desc : "ABCD", 
    value: 3812,
    count:38
  },
]

This one is the last leaf node with keys "value" and "count" which I need to restructure and make the child node in this format这是最后一个带有键“value”和“count”的叶节点,我需要对其进行重组并以这种格式制作子节点

children: [
  { 
    name: "AgglomerativeCluster",
    desc : "ABC",
    children : [
      {
        name: "AgglomerativeCluster",
        desc : "ABC",
        value: 3938,
        count:39                   
      }
    ]

  }, 
  { 
    name: "CommunityStructure",
    desc : "ABCD",
    children : [
      {
        name: "CommunityStructure",
        desc : "ABCD",
        value: 3812,
        count:38                  
      }
    ] 

  },
]

As you can see this child node again should have a children key inside which I need to pass the value and count keys with the same "name" and "desc" keys.正如您所看到的,这个子节点再次应该有一个键,我需要在其中传递具有相同“name”和“desc”键的值和计数键。 I couldn't get the logic, it looks super complex anyone could solve this?我无法理解逻辑,它看起来超级复杂,任何人都可以解决这个问题?

Expected result:预期结果:

const result = {
  name: "flare",
  children: [
    {
      name: "analytics",
      desc : "A",
      children: [
        {
          name: "cluster",
          desc : "AB",
          children: [
            { 
              name: "AgglomerativeCluster",
              desc : "ABC",
              children : [
                {
                  name: "AgglomerativeCluster",
                  desc : "ABC",
                  value: 3938,
                  count:39                   
                }
              ]

            }, 
            { 
              name: "CommunityStructure",
              desc : "ABCD",
              children : [
                {
                  name: "CommunityStructure",
                  desc : "ABCD",
                  value: 3812,
                  count:38                  
                }
              ] 

            },
          ]
        },
        {
          name: "graph",
          desc : "ABCDE",
          children: [
            { 
              name: "BetweennessCentrality",
              desc : "AHF",
              children : [
                {
                  name: "BetweennessCentrality",
                  desc : "AHF",
                  value: 3534,
                  count:39
                }
              ] 

            },
            { 
              name: "LinkDistance",
              desc : "AmH",
              children : [
                {
                  name: "LinkDistance",
                  desc : "AmH",
                  value: 5731,
                  count:39 
                }
              ] 

            },
          ]
        },
        {
          name: "optimization",
          desc : "Ashg",
          children: [
            { 
              name: "AspectRatioBanker",
              desc : "Avnvs",
              children : [
                {
                  name: "AspectRatioBanker",
                  desc : "Avnvs",
                  value: 7074,
                  count:39 
                }
              ] 

            }
          ]
        }
      ]
    },
    {
      name: "animate",
      desc : "Amvs",
      children: [
        { 
          name: "Easing",
          desc : "Amnvs",
          children : [
            {
              name: "Easing",
              desc : "Amnvs",
              value: 17010,
              count:39 
            }
          ] 
        },
        { 
          name: "FunctionSequence",
          desc : "Abnvs",
          children : [
            {
              name: "FunctionSequence",
              desc : "Abnvs",
              value: 5842 ,
              count:39
            }
          ] 

        },
      ]
    },
  ]
};

You could do this using recursive function that will pass through index of the element in children array and also the parent so you can use splice method.您可以使用递归 function 来执行此操作,它将通过子数组中元素的索引以及父数组,因此您可以使用splice方法。

 const dataObj = {"name":"flare","children":[{"name":"analytics","desc":"A","children":[{"name":"cluster","desc":"AB","children":[{"name":"AgglomerativeCluster","desc":"ABC","value":3938,"count":39},{"name":"CommunityStructure","desc":"ABCD","value":3812,"count":38}]},{"name":"graph","desc":"ABCDE","children":[{"name":"BetweennessCentrality","desc":"AHF","value":3534,"count":39},{"name":"LinkDistance","desc":"AmH","value":5731,"count":39}]},{"name":"optimization","desc":"Ashg","children":[{"name":"AspectRatioBanker","desc":"Avnvs","value":7074,"count":39}]}]},{"name":"animate","desc":"Amvs","children":[{"name":"Easing","desc":"Amnvs","value":17010,"count":39},{"name":"FunctionSequence","desc":"Abnvs","value":5842,"count":39}]}]} function update(data, index = null, parent = null,) { if(data.children) { data.children.forEach((c, i) => { update(c, i, data.children) }) } else { const {name, desc} = data; const object = {name, desc, children: [{...data}]} parent.splice(index, 1, object) } } update(dataObj); console.log(dataObj)

You could restructure the last object.您可以重组最后一个 object。

 function restructure(object) { return object.children? Object.assign({}, object, { children: object.children.map(restructure) }): { name: object.name, desc: object.desc, children: [object] }; } var data = { name: "flare", children: [{ name: "analytics", desc: "A", children: [{ name: "cluster", desc: "AB", children: [{ name: "AgglomerativeCluster", desc: "ABC", value: 3938, count: 39 }, { name: "CommunityStructure", desc: "ABCD", value: 3812, count: 38 }] }, { name: "graph", desc: "ABCDE", children: [{ name: "BetweennessCentrality", desc: "AHF", value: 3534, count: 39 }, { name: "LinkDistance", desc: "AmH", value: 5731, count: 39 }] }, { name: "optimization", desc: "Ashg", children: [{ name: "AspectRatioBanker", desc: "Avnvs", value: 7074, count: 39 }] }] }, { name: "animate", desc: "Amvs", children: [{ name: "Easing", desc: "Amnvs", value: 17010, count: 39 }, { name: "FunctionSequence", desc: "Abnvs", value: 5842, count: 39 }] }] }, result = restructure(data); console.log(result);
 .as-console-wrapper { max-height: 100%;important: top; 0; }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM