Home > database >  Getting File Directories as nested Array object
Getting File Directories as nested Array object

Time:02-14

I want to get my file directories as nested array object but i can't seem to figure out how to convert

[
  'routes/files',
  'routes/files/emptyfolder',
  'routes/files/somefolder',
  'routes/files/somefolder/example.docx',
  'routes/files/test.docx',
  'routes/randomdata.json'
]

to

[
    {
      title: 'routes',
      content: [
        {
          title: 'files',
          content: [
            {
                title: 'empty folder',
                content: []
            },
            {
                title: 'somefolder',
                content: [
                    {
                        title: 'example.docx',
                    },
                ]
            },
            {
                title: 'test.docx',
            }
          ],
        },
        {
            title: 'randomdata.json'
        }
    ],
}
]

it looks impossible problem for me to solve. I would love to know how to solve it.

Thank you.

CodePudding user response:

Here is how I solved it: Not the best solution, but works.

const arr = [
  "routes/files",
  "routes/files/emptyfolder",
  "routes/files/somefolder",
  "routes/files/somefolder/example.docx",
  "routes/files/test.docx",
  "routes/randomdata.json",
];

const arr2 = arr.map((p) => p.split("/"));

const setNestedObjectField = (
  obj,
  props,
  value
) => {
  if (!Array.isArray(obj)) {
    if (!obj.content) {
      obj.content = [];
    }
    obj = obj.content;
  }
  for (const propName of props) {
    const next = obj.find((el) => el.title === propName);
    if (!next) {
      console.assert(props.at(-1) === propName);
      // last propName
      obj.push(value);
    } else {
      if (!next.content) {
        next.content = [];
      }
      obj = next.content;
    }
  }
};

const rez = [];
let index = 0;
while (arr2.some((s) => s[index] !== undefined)) {
  // arr2 = arr2.filter((a) => a.length);
  const layer = arr2.reduce((acc, pathArr) => {
    if (pathArr[index] === undefined) return acc;
    acc.add(pathArr.slice(0, index   1).join("/"));
    return acc;
  }, new Set());

  // console.log({ layer });

  for (const key of layer) {
    setNestedObjectField(rez, key.split("/"), { title: key.split("/").at(-1) });
  }
  index  ;
}

console.log(rez);
  • Related