Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Transforms an array of entries like this:
- //
- // [
- // 'baz.tar.gz',
- // 'foo/bar/lol.txt',
- // 'foo/bar/kaka/perro/siete/lol.txt'
- // ]
- //
- // into this one:
- //
- // baz.tar.gz:
- // size: 10
- // foo:
- // size: 3
- // entries:
- // bar:
- // size: 3
- // entries:
- // lol.txt:
- // size: 7
- // kaka:
- // size: 4
- // entries:
- // perro:
- // size: 5
- // entries:
- // siete:
- // size: 5
- // entries:
- // lol.txt:
- // size: 7
- const entries = [
- 'baz.tar.gz',
- 'foo/bar/lol.txt',
- 'foo/bar/kaka/perro/siete/lol.txt'
- ];
- function printTree(tree, padding = '') {
- if (typeof tree !== 'object') {
- return ` ${tree}`;
- }
- return Object.keys(tree).reduce((output, key) => {
- return `${output}\n${padding}${key}:${printTree(tree[key], `${padding} `)}`;
- }, '');
- }
- function mergeEntryTrees(tree = {}, otherTree = {}) {
- if (typeof tree !== 'object' && typeof otherTree !== 'object') {
- return tree;
- }
- const allKeys = [...new Set([...Object.keys(tree), ...Object.keys(otherTree)])];
- return allKeys.reduce((partialTree, key) => {
- if (tree[key] && !otherTree[key]) {
- partialTree[key] = tree[key];
- }
- if (!tree[key] && otherTree[key]) {
- partialTree[key] = otherTree[key];
- }
- if (tree[key] && otherTree[key]) {
- partialTree[key] = mergeEntryTrees(tree[key], otherTree[key]);
- }
- return partialTree;
- }, {});
- }
- entries
- .map((entry) => {
- return entry.split('/').reduceRight((partialTree, part) => {
- return {
- [part]: {
- size: part.length,
- entries: partialTree,
- },
- };
- }, {});
- })
- .reduce((tree, partialTree) => {
- return mergeEntryTrees(tree, partialTree);
- }, {});
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement