如何最好地将JSON子数据对象数组重组为父数组

时间:2018-09-07 00:54:45

标签: javascript arrays json

我们有一些JSON数据,其中每个父数组对象可以具有一个属性,该属性是“子级”数组,如下所示:

data: [
  {
    value: 1,
    parent_id: null,
    label: "1.0 - TT One",
    children: [
      {
        value: 3,
        label: "1.1 - TT One-One",
        parent_id: 1,
      },
     {
        value: 4,
        label: "1.2 - TT One-Two",
        parent_id: 1,
     }
    ]
  },
  {
    value: 2,
    parent_id: null,
    label: "2.0 - TT Two",
    children: [
      {
        value: 5,
        label: "2.1 - TT Two-One",
        parent_id: 2,
      }
    ]
  }
]

我们想“拉平”孩子,以便最终得到一个由所有父母和孩子组成的数组,如下所示(如果效率不高,则不必保留命名数据):

data: [
  {  
    value: 1,
    parent_id: null,
    label: "1.0 - TT One"
  },
  {  <-- FORMER CHILD
    value: 3,
    label: "1.1 - TT One-One",
    parent_id: 1
   },
   {  <-- FORMER CHILD
     value: 4,
     label: "1.2 - TT One-Two",
     parent_id: 1,
   },
   {
     value: 2,
     parent_id: null,
     label: "2.0 - TT Two"
   },
   {  <-- FORMER CHILD
     value: 5,
     label: "2.1 - TT Two-One",
     parent_id: 2,
   }
]  

如何在高效的庄园中最好地做到这一点?我们有下划线是否有帮助。

1 个答案:

答案 0 :(得分:1)

  

找到了要对数组进行展平的一堆数组和对数组进行展平的一些对象,但是没有将两者结合在一起。如果我们有这个,我们就不需要发布。如果从我们到底需要什么到我们真正需要的东西不是很明显,那有什么意义呢?

重点是要了解什么是您的数据结构以及如何访问该数据结构的每个元素。

由于只有2个级别,因此您甚至无需寻找将初始数据转换为数组的一般解决方案。您知道如何遍历数组吗?那么您就会知道如何遍历具有数组属性的元素。

无论如何,这里既是递归的又是非递归的广义解决方案。

var d = [{
    value: 1,
    parent_id: null,
    label: "1.0 - TT One",
    children: [{
        value: 3,
        label: "1.1 - TT One-One",
        parent_id: 1,
      },
      {
        value: 4,
        label: "1.2 - TT One-Two",
        parent_id: 1,
      }
    ]
  },
  {
    value: 2,
    parent_id: null,
    label: "2.0 - TT Two",
    children: [{
      value: 5,
      label: "2.1 - TT Two-One",
      parent_id: 2,
    }]
  }
];

function walkRecursive(data) {
  let result = []
  data.forEach(element => {
    let e = { ...element}
    result.push(e);
    if (e.children) {
      let children = walkRecursive(e.children)
      result = result.concat(children)
      delete e.children
    }
  });
  return result;
}

function walk(data) {
  data = data.slice()
  let result = []
  let d, oldData;
  while (d = data.shift()) {
    let el = { ...d}
    result.push(el)
    if (el.children) {
      oldData = data
      data = el.children.slice();
      delete el.children;
    } else {
      if (oldData && data.length == 0) {
        data = oldData
        oldData = null;
      }
    }
  }
  return result;
}


console.log(walkRecursive(d))
console.log(walk(d))

https://codeburst.io/learn-and-understand-recursion-in-javascript-b588218e87ea