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