Javascript 如何将json数组中的'pid'转换为'children'形式的数组?

Javascript 如何将json数组中的'pid'转换为'children'形式的数组?,javascript,Javascript,原始阵列: const data1=[ { id:1, pid:0 }, { id:2, pid:1 }, { id:3, pid:2 } ] 如何将json数组中的pid转换为子数组表单 如何把他变成: [ { id:1, pid:0, 儿童:[ { id:2, pid:1, 儿童:[ { id:3, pid:2 } ] } ] } ] ----------------------------------- 他通过pid 如何编写函数 谢谢 const数据=[ { id:1, pid:0

原始阵列:

const data1=[
{
id:1,
pid:0
},
{
id:2,
pid:1
},
{
id:3,
pid:2
}
]
如何将json数组中的
pid
转换为
子数组
表单

如何把他变成:

[
{
id:1,
pid:0,
儿童:[
{
id:2,
pid:1,
儿童:[
{
id:3,
pid:2
}
]
}
]
}
]
----------------------------------- 他通过
pid

如何编写
函数

谢谢

const数据=[
{
id:1,
pid:0
},
{
id:4,
pid:3
},
{
id:2,
pid:1
},
{
id:3,
pid:2
}
];
函数toTree(数据){
data.forEach(功能(项){
删除项目1。儿童;
});
常量映射={};
data.forEach(功能(项){
map[item.id]=项目;
});
设val=[];
data.forEach(功能(项){
const parent=map[item.pid];
如果(家长){
(parent.children | |(parent.children=[])).push(项目);
}否则{
推送值(项目);
}
});
返回val;
}
log(JSON.stringify(toTree(data))
您可以使用它像
map
一样迭代数组,除了:对于第一次迭代,
el1
el2
是数组的第一个和第二个元素,然后对于之后的迭代,
el1
是上一次迭代的返回值,
el2
是数组的下一个元素。与对数组的每个元素进行操作的map不同,reduce使用数组的每个元素生成单个返回值

data1.reduce((el1, el2)=>{el1.children = [el2]; return el2;});
因此,这会将
data1
的所有元素依次附加到第一个元素。您的最终输出应该是一个数组,因此

const tree = [data1[0]]
跟进:如果数据还没有按id排序,您可以这样做

data1.sort((el1, el2) => {return el1.id > el2.id ? 1 : -1});
const data1=[
{
id:1,
pid:0
},
{
id:2,
pid:1
},
{
id:3,
pid:2
}
]
data1.reduce((a,b)=>{a.children=[b];返回b;});
常量树=[data1[0]];

控制台日志(树)我认为最好的方法是使用递归在每个元素上循环,并将其作为前一个元素的子元素

const data1 = [
  {
    id: 1,
    pid: 0
  },
  {
    id: 2,
    pid: 1
  },
  {
    id: 3,
    pid: 2
  }
];

function convert(arr){
    let counter = 0;
  let convertedArray = [];

  function recursiveFunction(currentObject = null){
            if(counter >= arr.length)   return convertedArray;

      if(currentObject == null){
      currentObject = {
        children: [arr[0]]
        }
        convertedArray.push(currentObject);
      } else {  
        currentObject.children = [ arr[counter] ];
      }


      counter++;

      return recursiveFunction(currentObject.children[0]);   
    }

  return recursiveFunction();

}


let newData = convert(data1);

console.log(newData);

有不止一种方法可以做到这一点。到目前为止你都尝试了什么?我的水平相对较低,我必须为
s写无数的
,我想看看每个人的方法,谢谢你同样,我想先看看你的方法。由于使用for循环,作为提示,可以将其实现为double for循环。这样,您只需要两个for循环。。。。。太难了。你还是应该把它贴出来。因为这是你的努力。也许你走对了方向。如果它被否决,我个人会投赞成票。这是一个学习型社区,对吗?我和你一样喜欢编码。仅仅因为它不起作用(现在),并不意味着它没有学习价值。。。当然,很可能有一种方法可以解决你的问题。我个人不知道如何做到这一点。我会像你一样使用循环。我只想看看你做了什么,因为这是解决开放式问题的最佳方法。@ebytebyte你的
数据总是按照你所展示的那样排序吗?此解决方案假定您的
数据
数组已经是根节点的平面树格式。@ebytebyte我不确定我是否对此给出了最好的解释,但我很高兴它解决了您的问题。您也应该仔细阅读reduce上的MDN文档,因为它可能有助于澄清我在解释中没有充分解释的任何内容。@GetSet如果不知道问题中的样本数据之外正在使用哪些类型的真实数据,就很难进一步推测,以及排序要求是什么,而不是根据问题中未明确说明但假设的id进行排序。同意@ChiliNut这很有趣,但如果id和pid的排序是MessylEver解决方案,则仍然存在问题。
const data1 = [
  {
    id: 1,
    pid: 0
  },
  {
    id: 2,
    pid: 1
  },
  {
    id: 3,
    pid: 2
  }
];

function convert(arr){
    let counter = 0;
  let convertedArray = [];

  function recursiveFunction(currentObject = null){
            if(counter >= arr.length)   return convertedArray;

      if(currentObject == null){
      currentObject = {
        children: [arr[0]]
        }
        convertedArray.push(currentObject);
      } else {  
        currentObject.children = [ arr[counter] ];
      }


      counter++;

      return recursiveFunction(currentObject.children[0]);   
    }

  return recursiveFunction();

}


let newData = convert(data1);

console.log(newData);