-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.js
32 lines (31 loc) · 1.17 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
const flatToTree = (flatArray, options) => {
options = {
id: "id",
parentId: "parentId",
children: "children",
...options
};
const dictionary = {}; // a hash table mapping to the specific array objects with their ids as key
const tree = [];
const children = options.children;
flatArray.forEach(node => {
const nodeId = node[options.id];
const nodeParentId = node[options.parentId];
// set up current node data in dictionary
dictionary[nodeId] = {
[children]: [], // init a children property
...node, // add other propertys
...dictionary[nodeId] // children will be replaced if this node already has children property which was set below
};
dictionary[nodeParentId] = dictionary[nodeParentId] || { [children]: [] }; // if it's not exist in dictionary, init an object with children property
dictionary[nodeParentId][children].push(dictionary[nodeId]); // add reference to current node object in parent node object
});
// find root nodes
Object.values(dictionary).forEach(obj => {
if (typeof obj[options.id] === "undefined") {
tree.push(...obj[children]);
}
});
return tree;
};
export default flatToTree;