Объединять повторяющиеся элементы от начала и записывать в соответствующие вложенности
let data = [
[10, 101, 1001],
[10, 101, 1002, 10003, 100004],
[10, 102],
[11, 111, 1111]
]
Есть массив элементов, где могут повторятся элементы, нужно объединять такие элементы и записывать в соответствующие вложенности идущие следом элементы. Должно выглядеть как-то так:
[
{
id: 10,
children: [
{
id: 101,
children: [
{
id: 1001,
children: []
},
{
id: 1002,
children: [{
id: 10003,
children: [{
id: 100004,
children: []
}]
}]
}
]
},
{
id: 102,
children: []
}
]
},
{
id: 11,
children: [{
id: 111,
children: [{
id: 1111,
children: []
}]
}]
}
]
Я перевернул массив, что бы шли элементы по порядку от первых к последним, удалил дубликаты, но получается потерял связи...
let data = [
[10, 101, 1001],
[10, 101, 1002, 10003, 100004],
[10, 102],
[11, 111, 1111]
]
let result = []
for (let i = 0; i < data.length; i++){
for (let j = 0; j < data[i].length; j++) {
!result[j] ? result[j] = [] : null
result[j].push(data[i][j])
}
}
// получаю первые, вторые и тд эелементы, как бы переворачиваю массив,
// могу удалить все дубликаты ... new Set но тогда я теряю связи
let unique = []
result.forEach( elem => {
unique.push(...new Set(elem))
})
console.log(unique)
Даже в голову ничего не приходит, как тогда это сделать..
UPD
let data =
[
[{id: 10}, {id: 101}, {id: 1001}],
[{id: 10}, {id: 101}, {id: 1002}, {id: 10001}],
[{id: 10}, {id: 102}],
[{id: 11}, {id: 103}, {id: 1003}],
[{id: 11}, {id: 104}]
]
Ответы (1 шт):
Автор решения: Stepan Kasyanenko
→ Ссылка
Можно разбить на два шага
- Строите сначала плоский массив объектов с указанием id родителя.
- Потом этот массив превращаете в дерево
let data = [
[10, 101, 1001],
[10, 101, 1002, 10003, 100004],
[10, 102],
[11, 111, 1111]
]
class TreeConverter {
constructor(data) {
this.data = data;
}
createNode(id, parentId) {
return {
id,
parentId,
children: []
};
}
isExistInFlatNodes(flatNodes, node) {
return !!flatNodes[node.id];
}
getFlatNodes() {
const flatNodes = {};
this.data.forEach(line => {
line.forEach((el, i) => {
const newNode = this.createNode(el, line[i - 1]);
if (!this.isExistInFlatNodes(flatNodes, newNode)) {
flatNodes[newNode.id] = newNode;
}
});
});
return flatNodes;
}
getTreeFromFlatNodes(flatNodes) {
const tree = [];
const nodes = Object.values(flatNodes);
nodes.forEach(node => {
if (node.parentId === undefined) {
tree.push(node);
} else {
const parentNode = flatNodes[node.parentId];
parentNode.children.push(node);
}
});
return tree;
}
getTree() {
const flatNodes = this.getFlatNodes();
return this.getTreeFromFlatNodes(flatNodes);
}
}
const converter = new TreeConverter(data);
console.log(converter.getTree())