Javascript:连接多个包含路径的数组,并以特殊方式转换为对象
Javascript: connect multiple arrays containing paths and convert to object in a special way
我尝试了很多让它工作,但它只是失败了...
我有一个包含多个其他数组的数组:
let arr = [
["Users"],
["Users", "john"],
["Users", "john", "Desktop"],
["Users", "john", "Documents"],
["Users", "john", "Documents", "Folder"]
];
我需要将其转换为一个对象:
let obj = {
Users: {
john: {
Desktop: {},
Documents: {
Folder: {}
}
}
}
};
但是还有两件事:
let arr = [
["Users"],
["Users", "john", "Desktop"],
["Users", "john", "Documents"],
["Users", "john", "Documents", "Folder"]
];
应该只有return(因为缺少["Users", "john"]
)
let obj = {
Users: {}
};
和 它也应该工作,如果数组不是这样排序的:
let arr = [
["Users", "john", "Documents"],
["Users", "john", "Documents", "Folder"]
["Users", "john"],
["Users", "john", "Desktop"],
["Users"],
];
有人可以帮忙吗? :)
这是一种无需修改输入数组即可执行此操作的方法:
function dirToObj(array) {
return array
.slice() // prevent modification
.sort((a, b) => a.length - b.length) // sort by depth
.reduce(function merge(acc, [prop, ...path]) {
// recursively build object
if (acc) {
if (path.length > 0) {
merge(acc[prop], path)
} else {
acc[prop] = {}
}
}
return acc
}, {})
}
let arr1 = [
["Users"],
["Users", "john", "Desktop"],
["Users", "john", "Documents"],
["Users", "john", "Documents", "Folder"]
]
let arr2 = [
["Users", "john", "Documents"],
["Users", "john", "Documents", "Folder"],
["Users", "john"],
["Users", "john", "Desktop"],
["Users"]
]
console.log(dirToObj(arr1))
console.log(dirToObj(arr2))
参考资料
Array#slice()
: 对输入数组进行浅拷贝以避免修改输入
Array#sort()
:按深度对路径进行排序,以便无论内部数组的初始顺序如何,都能正确构建对象。
Array#reduce()
:在传递和修改单个累加器(输出对象)的同时迭代数组。
- Unpacking fields and Rest parameter: 解压每个内部数组并递归到每个目录名的累加器对象中。
我尝试了很多让它工作,但它只是失败了... 我有一个包含多个其他数组的数组:
let arr = [
["Users"],
["Users", "john"],
["Users", "john", "Desktop"],
["Users", "john", "Documents"],
["Users", "john", "Documents", "Folder"]
];
我需要将其转换为一个对象:
let obj = {
Users: {
john: {
Desktop: {},
Documents: {
Folder: {}
}
}
}
};
但是还有两件事:
let arr = [
["Users"],
["Users", "john", "Desktop"],
["Users", "john", "Documents"],
["Users", "john", "Documents", "Folder"]
];
应该只有return(因为缺少["Users", "john"]
)
let obj = {
Users: {}
};
和 它也应该工作,如果数组不是这样排序的:
let arr = [
["Users", "john", "Documents"],
["Users", "john", "Documents", "Folder"]
["Users", "john"],
["Users", "john", "Desktop"],
["Users"],
];
有人可以帮忙吗? :)
这是一种无需修改输入数组即可执行此操作的方法:
function dirToObj(array) {
return array
.slice() // prevent modification
.sort((a, b) => a.length - b.length) // sort by depth
.reduce(function merge(acc, [prop, ...path]) {
// recursively build object
if (acc) {
if (path.length > 0) {
merge(acc[prop], path)
} else {
acc[prop] = {}
}
}
return acc
}, {})
}
let arr1 = [
["Users"],
["Users", "john", "Desktop"],
["Users", "john", "Documents"],
["Users", "john", "Documents", "Folder"]
]
let arr2 = [
["Users", "john", "Documents"],
["Users", "john", "Documents", "Folder"],
["Users", "john"],
["Users", "john", "Desktop"],
["Users"]
]
console.log(dirToObj(arr1))
console.log(dirToObj(arr2))
参考资料
Array#slice()
: 对输入数组进行浅拷贝以避免修改输入Array#sort()
:按深度对路径进行排序,以便无论内部数组的初始顺序如何,都能正确构建对象。Array#reduce()
:在传递和修改单个累加器(输出对象)的同时迭代数组。- Unpacking fields and Rest parameter: 解压每个内部数组并递归到每个目录名的累加器对象中。