转自:https://www.jianshu.com/p/639856724e92
arrayToTree(data) {
let result = [];
if (!Array.isArray(data)) {
return result;
}
// 清除已存在的children 重新赋值
data.forEach(item => {
delete item.children;
});
let map = {};
data.forEach(item => {
map[item.deptId] = item;
});
data.forEach(item => {
let parent = map[item.pDeptId];
if (parent) {
(parent.children || (parent.children = [])).push(item);
} else {
result.push(item);
}
});
return result;
},
var transObject = function(tableData, keys) {
let hashTable = {}, res = []
for (let i = 0; i < tableData.length; i++) {
let arr = res, cur = hashTable
for (let j = 0; j < keys.length; j++) {
let key = keys[j], filed = tableData[i][key]
if (!cur[filed]) {
let pusher = {
value: filed
}, tmp
if (j !== (keys.length - 1)) {
tmp = []
pusher.children = tmp
}
cur[filed] = { $$pos: arr.push(pusher) - 1 }
cur = cur[filed]
arr = tmp
} else {
cur = cur[filed]
arr = arr[cur.$$pos].children
}
}
}
return res
}
var data = [{
"province": "浙江",
"city": "杭州",
"name": "西湖"
}, {
"province": "四川",
"city": "成都",
"name": "锦里"
}, {
"province": "四川",
"city": "成都",
"name": "方所"
}, {
"province": "四川",
"city": "阿坝",
"name": "九寨沟"
}]
var keys = ['province', 'city', 'name']
console.log(transObject(data, keys))
//返回值:
[
{
"value": "浙江",
"children": [
{
"value": "杭州",
"children": [
{
"value": "西湖"
}
]
}
]
},
{
"value": "四川",
"children": [
{
"value": "成都",
"children": [
{
"value": "锦里"
},
{
"value": "方所"
}
]
},
{
"value": "阿坝",
"children": [
{
"value": "九寨沟"
}
]
}
]
}
]
function getSortOutList(data){
let newObj = {}
data.forEach((item, index) => {
// 解构出每一个对象里面type字段的值
let { type } = item
// 如果在这个新对象里面没有找到,则新增一个对象
if (!newObj[type]) {
// 重构对象
newObj[type] = {
type,
children: [],
}
}
// 如果在对象里面找到有相同的 type 字段的值,则Push进入children里面
newObj[type].children.push(item)
})
let newArr = Object.values(newObj)
return newArr
}
// 可以配合循环归类出你想要的字段 比如type相同的数据合并成一个children
let testObj = [
{ type: '测试1', name: '小橙', age: '18', height: '177' },
{ type: '测试1', name: '小W', age: '11', height: '177' },
{ type: '测试2', name: '小E', age: '12', height: '177' },
{ type: '测试3', name: '小R', age: '13', height: '177' },
{ type: '测试2', name: '小T', age: '14', height: '177' },
{ type: '测试3', name: '小Y', age: '19', height: '177' },
{ type: '测试4', name: '小U', age: '20', height: '177' },
]
const list = getSortOutList(testObj)
console.log('测试数据', list)