如何使用JavaScript从字符串创建嵌套对象

如何使用JavaScript从字符串创建嵌套对象,javascript,object,Javascript,Object,我有这样一个数组: ['IT/Programming/Frontend/Angular1','IT/Programming/Frontend/Angular2','IT/Programming/Frontend/React Js','IT/Programming/Backedn/C#', 'IT/Programming/Backedn/Java','IT/Programming/Backedn/Python','IT/Networking/Internet'] 我想创建一个这样的嵌套对象,它基

我有这样一个数组:

['IT/Programming/Frontend/Angular1','IT/Programming/Frontend/Angular2','IT/Programming/Frontend/React Js','IT/Programming/Backedn/C#', 'IT/Programming/Backedn/Java','IT/Programming/Backedn/Python','IT/Networking/Internet']
我想创建一个这样的嵌套对象,它基本上是一个嵌套对象(层次树结构):

我能够创建嵌套对象,但不确定如何添加键值,以下是我的代码:

function  createObject(array) {
    let obj = {};
    for (let key of array) {
        let putInto = obj;
        let tokens = key.split('/');
        for (let i = 0; i < tokens.length; i++) {
            let name = tokens[i];
            let value = (i === tokens.length - 1) ? '' : {};
            putInto[name] = putInto[name] || value;
            putInto = putInto[name];
        }
    }
    return obj;
}
createObject(myArr)
函数createObject(数组){
设obj={};
for(数组的let键){
设putino=obj;
让tokens=key.split('/');
for(设i=0;i
分两步:第一步,按映射中的第一个元素对字符串进行分组,第二步,迭代映射并递归应用生成器:

函数makeTreeA(项目){
设m=新映射
items.forEach(([text,…rest])=>{
如果(!m.has(text))
m、 集合(文本,[])
if(剩余长度)
m、 获取(文本)。推送(rest)
});
返回[…m].map([text,children])=>childrence.length
?{文本,儿童:makeTreeA(儿童)}
:{text}
)
}
const makeTree=strings=>makeTreeA(strings.map(s=>s.split('/'))
//
s=['IT/Programming/Frontend/Angular1'、'IT/Programming/Frontend/Angular2'、'IT/Programming/Frontend/React Js'、'IT/Programming/Backedn/C#'、'IT/Programming/Backedn/Java'、'IT/Programming/Backedn/Python'、'IT/Networking/Internet']

log(makeTree(s))
分两步进行:首先,按映射中的第一个元素对字符串进行分组,其次,迭代映射并递归应用生成器:

函数makeTreeA(项目){
设m=新映射
items.forEach(([text,…rest])=>{
如果(!m.has(text))
m、 集合(文本,[])
if(剩余长度)
m、 获取(文本)。推送(rest)
});
返回[…m].map([text,children])=>childrence.length
?{文本,儿童:makeTreeA(儿童)}
:{text}
)
}
const makeTree=strings=>makeTreeA(strings.map(s=>s.split('/'))
//
s=['IT/Programming/Frontend/Angular1'、'IT/Programming/Frontend/Angular2'、'IT/Programming/Frontend/React Js'、'IT/Programming/Backedn/C#'、'IT/Programming/Backedn/Java'、'IT/Programming/Backedn/Python'、'IT/Networking/Internet']

console.log(makeTree))
你的输入数组是什么?
['IT/Programming/Frontend/Angular1','IT/Programming/Frontend/Angular2','IT/Programming/Frontend/React Js','IT/Programming/Backedn/C#','IT/Programming/Backedn/Python','IT/Networking/Internet']
会有一个条目吗。。例如Account/xxxxxx?是的,可能有,可以有多个相同级别的层次结构,如it/xx/xx、Account/xx/xx、support/xx/xx。另外,如果有重复记录怎么办?例如,2项是相同的。您是否忽略了重复的一个或仍然将其添加到对象中?您的输入数组是什么?
['it/Programming/Frontend/Angular1'、'it/Programming/Frontend/Angular2'、'it/Programming/Frontend/React Js'、'it/Programming/Backedn/C#'、'it/Programming/Backedn/Java'、'it/Programming/Backedn/Python/Internet']
是否会有一个项目不是它/xxx/xx。。例如Account/xxxxxx?是的,可能有,可以有多个相同级别的层次结构,如it/xx/xx、Account/xx/xx、support/xx/xx。另外,如果有重复记录怎么办?例如,2项是相同的。您是否忽略了重复的一个或仍然将其添加到对象中?
function  createObject(array) {
    let obj = {};
    for (let key of array) {
        let putInto = obj;
        let tokens = key.split('/');
        for (let i = 0; i < tokens.length; i++) {
            let name = tokens[i];
            let value = (i === tokens.length - 1) ? '' : {};
            putInto[name] = putInto[name] || value;
            putInto = putInto[name];
        }
    }
    return obj;
}
createObject(myArr)