【问题标题】:Get the last child node from complex json like structure and restructure only the last node in javascript从复杂的 json 结构中获取最后一个子节点,并仅重构 javascript 中的最后一个节点
【发布时间】:2019-11-03 14:22:53
【问题描述】:

我需要更改由对象和数组组成的复杂 json 结构的结构。 假设原始对象是 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
        },
      ]
    },
  ]
};

我需要获取最后一个由键“value”和“count”组成的子节点 例如:

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

这是最后一个带有键“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                  
      }
    ] 

  },
]

你可以再次看到这个子节点应该有一个 children 键,我需要在其中传递具有相同“name”和“desc”键的 value 和 count 键。我无法理解逻辑,它看起来超级复杂,任何人都可以解决这个问题?

预期结果:

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
            }
          ] 

        },
      ]
    },
  ]
};

【问题讨论】:

    标签: javascript arrays json object


    【解决方案1】:

    你可以重构最后一个对象。

    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; }

    【讨论】:

      【解决方案2】:

      您可以使用递归函数来执行此操作,该函数将传递子数组中元素的索引以及父数组,因此您可以使用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)

      【讨论】:

        猜你喜欢
        • 2012-12-22
        • 1970-01-01
        • 2023-03-30
        • 2019-07-06
        • 1970-01-01
        • 2019-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多