let arr = [
{ 'country': '国内', 'reputation': '985', 'university': '北京大学', 'university_id': 'beijig' },
{ 'country': '国内', 'reputation': '211', 'university': '清华大学', 'university_id': 'qinghua' },
{ 'country': '国内', 'reputation': '985', 'university': '浙江大学', 'university_id': 'zhejiang' },
{ 'country': '国内', 'reputation': '211', 'university': '武汉大学', 'university_id': 'wuhan' },
{ 'country': '国内', 'reputation': '其它', 'university': '邯郸大学', 'university_id': 'handan' },
{ 'country': '国内', 'reputation': '其它', 'university': '沧州大学', 'university_id': 'cangzhou' },
{ 'country': '国外', 'reputation': '其它', 'university': '哈弗大学', 'university_id': 'hafu' },
{ 'country': '国外', 'reputation': '其它', 'university': '剑桥大学', 'university_id': 'jianqiao' },
{ 'country': '国外', 'reputation': '其它', 'university': '牛津大学', 'university_id': 'niujin' }
]
function groupBy(arr,...groupKeys){
//arr是输入的数组,groupKeys是后期要区分的key值
const [key,...restGroupKeys] = groupKeys;
//key是一维区分的值
const groupObj = Object.entries(arr.reduce((result,item)=>{
//对数组对象累加
//Object.entries 方法返回一个给定对象自身可枚举属性的键值对数组
//arr.reduce 对数组对象累加
const {[key]: grouKey,...restProps} = item;
// 取第一个key值作为区分一维数组的键
const list = result[grouKey] = result[grouKey]||[];
// 判断一维key值是否存在,如果存在
list.push(restProps)
// 给一维数组加二维属性
return result;
},[]))
return groupObj.map(([groupKey, children])=>{
return {
[key]: groupKey,
children: restGroupKeys.length ? groupBy(children, ...restGroupKeys) : children
//判断是否是最后一层,如果是返回自身,否则继续递归执行
}
})
}
var arr1 = groupBy(arr, 'country', 'reputation');