Javascript 将对象数组转换为嵌套数组

Javascript 将对象数组转换为嵌套数组,javascript,Javascript,我有一个对象数组 [ { id: 1, parent_id: null, title: 'Title 1' }, { id: 2, parent_id: 1, title: 'Title2' }, { id: 3, parent_id: 2, title: 'Title 3' }, { id: 4, parent_id: null, title: 'Title 4' } ] 我需要把这个数组转换成这个 [ { id: 1, parent_id: null

我有一个对象数组

[  
 { id: 1, parent_id: null, title: 'Title 1' },
 { id: 2, parent_id: 1, title: 'Title2' },
 { id: 3, parent_id: 2, title: 'Title 3' },
 { id: 4, parent_id: null, title: 'Title 4' }  
]
我需要把这个数组转换成这个

[ 
  { 
    id: 1,
    parent_id: null,
    children: [  
        { 
          id: 2,
          parent_id: 1,
          title: 'Title2',
          children: [ 
            {  id: 3, parent_id: 2, title: "Title 3" } 
          ] 
        }
    ]
  },  
  {id: 4, parent_id: null, title: 'Title 4' } 
] 

我不知道,如何才能做到这一点

我认为这会起作用:

const original = [  
 { id: 1, parent_id: null, title: 'Title 1' },
 { id: 2, parent_id: 1, title: 'Title2' },
 { id: 3, parent_id: 2, title: 'Title 3' },
 { id: 4, parent_id: null, title: 'Title 4' }  
]


const transform = arr => {
  for (let i = arr.length - 1; i >= 0; i--) {
    const post = arr[i]
    const parent = arr.find(p => p.id === post.parent_id)
    if (parent) {
      if (!parent.children) {
        parent.children = []
      }
      parent.children.push(post)
      post.duplicate = true
    }
  }
  for (let i = arr.length - 1; i >= 0; i--) {
    if (arr[i].duplicate) {
        arr.splice(i, 1)
    }
  }
  return arr
}

console.log(transform(original))

这里有一个问题:

您可以采用标准方法从id和父id的数据生成树

var data=[{id:1,parent_id:null,title:'title 1'},{id:2,parent_id:1,title:'Title2'},{id:3,parent_id:2,title:'title 3'},{id:4,parent_id:null,title:'title 4'}],
树=函数(数据,根){
var t={};
data.forEach(o=>{
赋值(t[o.id]=t[o.id]|{},o);
t[o.parent_id]=t[o.parent_id]|{};
t[o.parent_id]。children=t[o.parent_id]。children | |[];
t[o.parent\u id].children.push(t[o.id]);
});
返回t[root]。子对象;
}(数据,空);
控制台日志(树)

.as控制台包装{max height:100%!important;top:0;}
尝试以下递归:

function update(item) {
    if (item.parent_id) {
        const parent = arr.findIndex(p => p.id === item.parent_id);
        if (!arr[parent].children)
            arr[parent].children = [];
        const index = arr[parent].children.findIndex(ch => ch.id === item.id);
        if (index >= 0)
            arr[parent].children.splice(index, 1);
        arr[parent].children.push(item);
        update(arr[parent]);
    }
}

arr.forEach(item => update(item));
arr = arr.filter(item => !item.parent_id);

console.log(arr);

@这个问题是如何证明研究工作的?请展示你自己为解决这个问题所做的任何尝试。您应该已经尝试过,我们可以帮助您调试。此外,是否对数据进行了排序?什么不起作用?