树的字符串路径(Javascript)

树的字符串路径(Javascript),javascript,reduce,tree-structure,Javascript,Reduce,Tree Structure,我有一个字符串格式的路径数组,如下所示: [ {u id:'女人/衣服/上衣',计数:10}, {u id:'女人/衣服/套装',计数:5}, {u id:'女性/配饰',计数:2}, {u id:'男人/衣服',计数:1}, ] 我想把它们分成这样的树状结构: [ { _id:'女性', 计数:17, 儿童:[ { _身份证:'衣服', 计数:15, 儿童:[ {{u id:'tops',计数:10}, {{u id:'套装',计数:5} ] }, { _id:'附件', 计数:2 } ]

我有一个字符串格式的路径数组,如下所示:

[
{u id:'女人/衣服/上衣',计数:10},
{u id:'女人/衣服/套装',计数:5},
{u id:'女性/配饰',计数:2},
{u id:'男人/衣服',计数:1},
]
我想把它们分成这样的树状结构:

[
{
_id:'女性',
计数:17,
儿童:[
{
_身份证:'衣服',
计数:15,
儿童:[
{{u id:'tops',计数:10},
{{u id:'套装',计数:5}
]
},
{
_id:'附件',
计数:2
}
]
},
{
_id:'男人',
计数:1,
儿童:[
{
_身份证:'衣服',
计数:1
}
]
}
]
我会想象一种叫做reduce方法的递归函数。但我不知道到底是怎么回事。我有点受不了了。 非常感谢,如果有人已经这样做了,并且有了解决方案:)

编辑:

我不知道为什么这个问题被否决了,但我设法接近了这个解决方案。但是我仍然得到一个空的对象键,当没有子项时,我无法不使用子项键:


常量getTree=(数组)=>{
返回数组.reduce((a,b)=>{
const items=b.\u id.replace('\/','').split('/'))
返回构造(a、b、计数、项目)
}, {})
}
常量构造=(a、计数、项目)=>{
const key=items.shift()
如果(!一个[键]){
a[钥匙]={
_id:钥匙,
伯爵:伯爵,
儿童:[]
}
a[key]。children=items.length>0?构造(a[key]。children,count,items):null
}
否则{
a[键].count+=count
a[key]。children=items.length>0?构造(a[key]。children,count,items):null
}
归还
}

像这样的东西应该有用吗

我首先创建了一个对象树,然后将其转换为具有子结构的对象数组

注意:我在中间结构中的每个对象上都使用了
\u count
属性,这样以后在循环键时(创建最终结构时),我可以轻松忽略
\u id
\u count
,只循环“真正的子键”,而不是以
\u
开头

如果有任何部分不清楚,请告诉我

在写这篇文章之前,我没有看过你当前的尝试/解决方案,所以我的看起来完全不同

const origData=[
{u id:'女人/衣服/上衣',计数:10},
{u id:'女人/衣服/套装',计数:5},
{u id:'女性/配饰',计数:2},
{u id:'男人/衣服',计数:1},
];
const newObj={};
对于(让origData的obj){
//控制台日志(obj)
常数tempArr=obj._id.split('/');
设tempHead=newObj;//指针
for(让idx以tempArr表示){
让头部=tempArr[idx];
如果(!tempHead.hasOwnProperty(head)){
tempHead[head]={};
}
tempHead=tempHead[头];
tempHead._id=头部;
常数currCount=临时头。|u count | 0;
tempHead._count=currCount+obj.count;
}
tempHead.\u count=obj.count;
}
console.log(newObj);
警察终结者=[];
设tempArrHead=finalArr;//指针
设tempObjHead=newObj;//指针
函数recursiveStuff(currObj、currArr、copyObj){
让孩子们都是假的;
const keys=Object.keys(currObj).filter(a=>!a.startsWith(“”);
对于(让钥匙中的钥匙){
hasChildren=正确;
常量对象={
_id:currObj[key]。\u id,
计数:currObj[key]。_计数| | 0,
儿童:[],
};
电流推力(obj);
recursiveStuff(currObj[key],obj.children,obj)
}
if(hasChildren==false){
//console.log(copyObj);
//也许有一种更优雅的方式,但这是可行的:
删除copyObj.children;
}
}
recursiveStuff(tempObjHead、tempArrHead)
控制台日志(finalArr)
。作为控制台包装器{
最大高度:100%!重要;

}
由于您没有命名键,所以只需循环所有元素,查找匹配的ID,再次循环以查找其子元素,等等。[递归]嗨,Benjamin,您无法自动执行此操作。但是我建议您,创建一个(例如)for循环,分离字符串,并将其格式化为所需的结构。@Justinas,我可以在结果映射中命名键,这不重要(men:{u id:men,…}。然后我可以将对象转换为数组。谢谢,这很好!我已经管理好了中间结构,但我错过了最后一个,它提供了我可以循环的数组。非常感谢!很高兴听到。不客气。