Skip to content Skip to sidebar Skip to footer

Nesting Array Based On Level

0: {content: 'Heading 1 2 3 4 5', level: 2, anchor: 'heading-1-2-3-4-5', className: 'testtest', fontWeight: '', …} 1: {content: 'Heading 2', level: 2, anchor: 'heading-2', fontWe

Solution 1:

You could take a helper array for the levels and one for the indices of each level as adjustment for not zero based or missing levels.

Imagine, all of your level properties are running from zero and are build upon this value and have no holes, you could take only the line

levels[index].push({ ...o, children: levels[index + 1] = [] });
//     ^^^^^                                                      parent
//                                          ^^^^^^^^^             children

with o.level instead of index.

Then only levels is uesd to move a node to the right position of the tree. Each level depends on the (smaller) level before.

The main problem with levels not starting with zero and by having missing levels is to adjust the level to a meaningful index. This is archived by using the level as value and using the index of an array of these values. The rule of getting an index is, if not found, take the last lenght of the array and push the level to the indices array. Otherwise short the indices array to length of index plus one, to prevent deeper nested symbols to be found in the array.

var data = [{ content: "Heading 1 2 3 4 5", level: 2 }, { content: "Heading 2", level: 2 }, { content: "Inner Heading", level: 2 }, { content: "Heading Level 3", level: 3 }, { content: "Heading Level 3-2", level: 3 }, { content: "Heading Level 4", level: 4 }, { content: "Heading Level 2", level: 2 }, { content: "Heading 4", level: 6 },  { content: "Heading 1", level: 1 }, { content: "Heading 5", level: 5 }],
    result = [],
    indices = [],
    levels = [result];
   
data.forEach(o => {
    var index = indices.findIndex(level => level >= o.level);
    if (index === -1) {
        index = indices.push(o.level) - 1;
    } else {
        indices.length = index + 1;
    }
    levels[index].push(Object.assign({}, o, { children: levels[index + 1] = [] }));
});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Post a Comment for "Nesting Array Based On Level"