将扁平化数据结构转化为树型结构:
也就是将
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;
}