将扁平化数据结构转化为树型结构

173 阅读1分钟

将扁平化数据结构转化为树型结构:
也就是将

var data = [
    { province: '浙江', city: '杭州', name: '西湖' },
    { province: '四川', city: '成都', name: '锦例' },
    { province: '四川', city: '成都', name: '方所' },
    { province: '四川', city: '阿坝', name: '九寨沟' }
];

转化为:

const result2 = [    {        value: '浙江',        children: [{ value: '杭州', children: [{ value: '西湖' }] }]
    },
    {
        value: '四川',
        children: [
            { value: '成都', children: [{ value: '锦里' }, { value: '方所' }] },
            { value: '阿坝', children: [{ value: '九寨沟' }] }
        ]
    }
];

用去重方法实现如下:

function revert(data, keys) {
    var hashTable = {};
    var result = [];
    for (let i = 0; i < data.length; i++) {
        if (!hashTable[data[i][keys[0]]]) {
            var len = result.push({
                value: data[i][keys[0]],
                children: []
            });
            hashTable[data[i][keys[0]]] = { pos: len - 1 };
        }

        if (!hashTable[data[i][keys[0]]][data[i][keys[1]]]) {
            let pos = hashTable[data[i][keys[0]]].pos;
            let len = result[pos].children.push({
                value: data[i][keys[1]],
                children: []
            });

            hashTable[data[i][keys[0]]][data[i][keys[1]]] = { pos: len - 1 };
        }
        let pos1 = hashTable[data[i][keys[0]]].pos;
        let pos2 = hashTable[data[i][keys[0]]][data[i][keys[1]]].pos;
        result[pos1].children[pos2].children.push({
            value: data[i][keys[2]]
        });
    }

    return result;
}

使用trie树实现:

function revert(data, keys) {
            var hashTable = {},
                res = [];
            for (let i = 0; i < data.length; i++) {
                arr = res;
                cur = hashTable;
                for (let j = 0; j < keys.length; j++) {
                    let field = data[i][keys[j]];
                    if (!cur[field]) {
                        let pusher = {
                            value: field
                        },
                            child;
                        if (j !== keys.length - 1) {
                            child = [];
                            pusher.children = child;
                        }

                        let len = arr.push(pusher);
                        cur[field] = { pos: len - 1 };
                        cur = cur[field];
                        arr = child;
                    } else {
                        cur = cur[field];
                        arr = arr[cur.pos].children;
                    }
                }
            }

            return res;
        }