Получить последний дочерний узел из сложной json-подобной структуры и реструктурировать только последний узел в javascript - PullRequest
2 голосов
/ 03 ноября 2019

Мне нужно изменить структуру сложной 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". Я не мог понять логику, это выглядит очень сложно, кто-нибудь может решить это?

Ожидаемый результат:

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

        },
      ]
    },
  ]
};

Ответы [ 2 ]

2 голосов
/ 03 ноября 2019

Вы можете реструктурировать последний объект.

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 голосов
/ 03 ноября 2019

Вы можете сделать это, используя рекурсивную функцию, которая будет проходить через индекс элемента в массиве children, а также родительский элемент, чтобы вы могли использовать метод 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...