Given the following data, which I obtain from an api and which is occasionally modified
const data = [
{
name: "BG",
latest: false,
dir: true,
etag: null,
objectName: "BG",
size: 0,
lastModified: null,
storageClass: null,
versionId: null,
childItems: [
{
etag: '"13dda89d102a62beb58c57a9477b252c"',
objectName: "BG/item.xml",
size: 12763,
lastModified: "2020-11-17T13:13:34.735Z",
storageClass: "STANDARD",
versionId: null,
childItems: null,
name: "item.xml",
latest: false,
dir: false,
},
{
etag: '"5baf1d6bcccc266bfc76cbe36724bd99"',
objectName: "BG/item.xml",
size: 17856,
lastModified: "2020-11-17T13:13:25.796Z",
storageClass: "STANDARD",
versionId: null,
childItems: null,
name: "item.xml",
latest: false,
dir: false,
},
],
},
{
name: "OTHER",
latest: false,
dir: true,
etag: null,
objectName: "OTHER",
size: 0,
lastModified: null,
storageClass: null,
versionId: null,
childItems: [
{
etag: '"ab37611f0b217b71804da19d9111bddd"',
objectName: "OTHER/item.xml",
size: 3953,
lastModified: "2020-11-18T09:12:25.634Z",
storageClass: "STANDARD",
versionId: null,
childItems: null,
name: "item.xml",
latest: false,
dir: false,
},
{
name: "MORE",
latest: false,
dir: true,
etag: null,
objectName: "OTHER/MORE/",
size: 0,
lastModified: null,
storageClass: null,
versionId: null,
childItems: [
{
etag: '"aea98cd3b3aea692475c329d79c9e7aa"',
objectName: "OTHER/MORE/item.backup",
size: 573934,
lastModified: "2020-11-18T09:45:08.986Z",
storageClass: "STANDARD",
versionId: null,
childItems: null,
name: "item.backup",
latest: false,
dir: false,
},
{
etag: '"1a36b1f644f71a2f62f9c347da5fc381"',
objectName: "OTHER/MORE/data.txt",
size: 1045,
lastModified: "2020-11-18T09:45:08.622Z",
storageClass: "STANDARD",
versionId: null,
childItems: null,
name: "data.txt",
latest: false,
dir: false,
},
],
},
],
},
];
I need to transform it to the following
[
{
label: "BG",
children: [
{
label: "item.xml",
data: "BG/item.xml",
},
{
label: "item.xml",
data: "BG/item.xml",
},
],
},
{
label: "OTHER",
children: [
{
label: "item.xml",
data: "OTHER/item.xml",
},
{
label: "MORE",
children: [
{
label: "item.backup",
data: "OTHER/MORE/item.backup",
},
{
label: "data.txt",
data: "OTHER/MORE/data.txt",
},
],
},
],
},
];
The criterion is that when the dir property of an object is true, obtain the name and assign it to the label property, of the children in the childItem property, obtain the values of the name and objectName properties
It has been a difficult task for me to reason, I thank you in advance for your help
Advertisement
Answer
Iterate over the data items. For each item, get the label and check dir; If true, recurse to process the children, otherwise get the data.
const processItems = items => items.map(item => {
const results = {
label: item.name,
};
if(item.dir) {
results.children = processItems(item.childItems);
}
else {
results.data = item.objectName;
}
return results;
};
const results = processItems(data);