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: 解压每个内部数组并递归到每个目录名的累加器对象中。