如何使用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)