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');
