Hi masters i need to find the best way to convert this:
[
{ "id": 1, "animal": "cat", "age": 6, "name": "loky" },
{ "id": 2, "animal": "cat", "age": 3, "name": "michu", "parent": 1 },
{ "id": 3, "animal": "cat", "age": 2, "name": "boots", "parent": 1 },
{ "id": 4, "animal": "dog", "age": 9, "name": "bones" },
{ "id": 5, "animal": "dog", "age": 6, "name": "chok", "parent": 4 },
{ "id": 6, "animal": "dog", "age": 6, "name": "cofee","parent": 4 }
]
to this:
[
{ "id": 1,
"animal": "cat",
"age": 6,
"name": "loky",
"childs":[ { "id": 2, "animal": "cat", "age": 3, "name": "michu", "parent": 1 },
{ "id": 3, "animal": "cat", "age": 2, "name": "boots", "parent": 1 }]
}
,
{ "id": 4,
"animal": "dog",
"age": 9,
"name": "bones",
"childs":[{ "id": 5, "animal": "dog", "age": 6, "name": "chok", "parent": 4 },
{ "id": 6, "animal": "dog", "age": 6, "name": "cofee", "parent": 4 }]
}
]
note that the "parent" key must be used to nest "childs" ,i create my way but with several functions is horrible ,i think there may be a more efficient way.
Thanks in advance sorry for my english
CodePudding user response:
const rows = [
{ id: 1, animal: 'cat', age: 6, name: 'loky' },
{ id: 2, animal: 'cat', age: 3, name: 'michu', parent: 1 },
{ id: 3, animal: 'cat', age: 2, name: 'boots', parent: 1 },
{ id: 4, animal: 'dog', age: 9, name: 'bones' },
{ id: 5, animal: 'dog', age: 6, name: 'chok', parent: 4 },
{ id: 6, animal: 'dog', age: 6, name: 'cofee', parent: 4 },
];
function map(rows) {
const categories = Array.from(new Set(rows.map((row) => row.animal)));
return categories.map((c) => {
const parent = rows.find((row) => row.animal === c);
parent.childs = rows
.filter((r) => r.id !== parent.id && r.animal === c)
.map((r) => ({ ...r, parent: parent.id }));
return parent;
});
}
console.log(map(row));
Simply create a mapper function to do.
CodePudding user response:
Maybe?
const rows = [
{ id: 1, animal: 'cat', age: 6, name: 'loky' },
{ id: 2, animal: 'cat', age: 3, name: 'michu', parent: 1 },
{ id: 3, animal: 'cat', age: 2, name: 'boots', parent: 1 },
{ id: 4, animal: 'dog', age: 9, name: 'bones' },
{ id: 5, animal: 'dog', age: 6, name: 'chok', parent: 4 },
{ id: 6, animal: 'dog', age: 6, name: 'cofee', parent: 4 },
];
function nester(arr) {
const parents = rows.filter((r) => !r.parent);
const children = rows.filter((r) => r.parent);
return parents.map((p) => {
return {
...p,
children: children.filter((c) => c.parent === p.id),
};
});
}
console.log(nester(rows));