Skip to content

Instantly share code, notes, and snippets.

@Akiyamka
Last active January 18, 2019 15:36
Show Gist options
  • Save Akiyamka/09206e11e58c1d08b4fe50fd8fce1e12 to your computer and use it in GitHub Desktop.
Save Akiyamka/09206e11e58c1d08b4fe50fd8fce1e12 to your computer and use it in GitHub Desktop.
Fold Childrens (playground: https://stackblitz.com/edit/js-rskhjq)
{
"childrens": [
{
"name": "foo_lvl_1",
"childrens": [
{
"name": "foo1_lvl_2",
"value": 13
},
{
"name": "foo2_lvl_2",
"childrens": [
{
"name": "foo1_lvl_3",
"value": 10
},
{
"name": "foo2_lvl_3",
"value": 10
}
]
},
{
"name": "foo3_lvl_2",
"childrens": [
{
"name": "foo1_lvl_3",
"value": 10
},
{
"name": "foo2_lvl_3",
"value": 10
},
{
"name": "foo2_lvl_3",
"value": 10
}
]
}
]
},
{
"name": "bar_lvl_1",
"childrens": [
{
"name": "bar1_lvl_2",
"childrens": [
{
"name": "foo1_lvl_3",
"childrens": [
{
"name": "foo1_lvl_4",
"value": 10
},
{
"name": "foo2_lvl_4",
"value": 10
}
]
},
{
"name": "foo1_lvl_3",
"childrens": [
{
"name": "foo1_lvl_4",
"value": 10
},
{
"name": "foo2_lvl_4",
"value": 10
}
]
},
{
"name": "foo3_lvl_2",
"childrens": [
{
"name": "foo1_lvl_3",
"value": 10
},
{
"name": "foo2_lvl_3",
"value": 10
}
]
}
]
},
{
"name": "bar2_lvl_2",
"childrens": [
{
"name": "bar1_lvl_3",
"childrens": [
{
"name": "bar1_lvl_4",
"value": 10
},
{
"name": "bar2_lvl_4",
"value": 10
}
]
},
{
"name": "bar1_lvl_3",
"childrens": [
{
"name": "bar1_lvl_4",
"value": 10
},
{
"name": "bar2_lvl_4",
"value": 10
}
]
},
{
"name": "bar3_lvl_2",
"childrens": [
{
"name": "bar1_lvl_3",
"value": 10
},
{
"name": "bar2_lvl_3",
"value": 10
}
]
}
]
},
{
"name": "bar3_lvl_2",
"childrens": [
{
"name": "bar1_lvl_3",
"childrens": [
{
"name": "bar1_lvl_4",
"value": 10
},
{
"name": "bar2_lvl_4",
"value": 10
}
]
},
{
"name": "bar2_lvl_3",
"childrens": [
{
"name": "bar1_lvl_4",
"value": 10
},
{
"name": "bar2_lvl_4",
"value": 10
}
]
},
{
"name": "bar3_lvl_3",
"childrens": [
{
"name": "bar1_lvl_4",
"value": 10
},
{
"name": "bar2_lvl_4",
"value": 10
}
]
}
]
}
]
},
{
"name": "baz_lvl_1",
"childrens": [
{
"name": "bar1_lvl_2",
"childrens": [
{
"name": "foo1_lvl_3",
"childrens": [
{
"name": "foo1_lvl_4",
"value": 10
},
{
"name": "foo2_lvl_4",
"value": 10
}
]
},
{
"name": "foo1_lvl_3",
"childrens": [
{
"name": "foo1_lvl_4",
"value": 10
},
{
"name": "foo2_lvl_4",
"value": 10
}
]
},
{
"name": "foo3_lvl_2",
"childrens": [
{
"name": "foo1_lvl_3",
"value": 10
},
{
"name": "foo2_lvl_3",
"value": 10
}
]
}
]
},
{
"name": "bar2_lvl_2",
"childrens": [
{
"name": "bar1_lvl_3",
"childrens": [
{
"name": "bar1_lvl_4",
"value": 10
},
{
"name": "bar2_lvl_4",
"value": 10
}
]
},
{
"name": "bar1_lvl_3",
"childrens": [
{
"name": "bar1_lvl_4",
"value": 10
},
{
"name": "bar2_lvl_4",
"value": 10
}
]
},
{
"name": "bar3_lvl_2",
"childrens": [
{
"name": "bar1_lvl_3",
"value": 10
},
{
"name": "bar2_lvl_3",
"value": 10
}
]
}
]
},
{
"name": "bar3_lvl_2",
"childrens": [
{
"name": "bar1_lvl_3",
"childrens": [
{
"name": "bar1_lvl_4",
"value": 10
},
{
"name": "bar2_lvl_4",
"value": 10
}
]
},
{
"name": "bar2_lvl_3",
"childrens": [
{
"name": "bar1_lvl_4",
"value": 10
},
{
"name": "bar2_lvl_4",
"value": 10
}
]
},
{
"name": "bar3_lvl_3",
"childrens": [
{
"name": "bar1_lvl_4",
"value": 10
},
{
"name": "bar2_lvl_4",
"value": 10
}
]
}
]
}
]
}
]
}
function foldChilndrens(tree, options, level = 0) {
const opt = {
children: 'children',
value: 'value',
maxLevel: 2,
clearValues: false,
...options
};
const calcLeafWeight = childrn => childrn.reduce(
(summ, chld) => (
chld[opt.children]
? calcLeafWeight(chld[opt.children])
: chld[opt.value]
) + summ, 0);
if (
!tree[opt.children]
|| tree[opt.children].length === 0
) return tree;
if (level < opt.maxLevel) {
// Delete value from tree;
if (opt.clearValues) {
let {[opt.value]: omit, ...rest} = tree;
} else {
let rest = tree
}
return {
...rest,
[opt.children]: tree[opt.children].map(child => foldChilndrens(child, options, level + 1))
}
}
// Delete children from tree;
let {[opt.children]: omit, ...leaf} = tree;
leaf.value = calcLeafWeight(omit);
return leaf;
}
foldChilndrens(dataset, {
children: 'childrens',
maxLevel: 3
}),
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment