SOURCE

var a = [
  				{fencid: 1, userType: '张三', name: 'zz1', id: 1, count: 1},  				
          {fencid: 2, userType: '王二', name: 'zz2', id: 2, count: 2},
  				{fencid: 3, userType: '张三', name: 'zz3', id: 3, count: 3},
  				{fencid: 4, userType: '李四', name: 'zz4', id: 4, count: 4},
  				{fencid: 1, userType: '张三', name: 'zz5', id: 5, count: 5},
          {fencid: 2, userType: '赵二', name: 'zz6', id: 6, count: 6},
  				{fencid: 1, userType: '二麻子', name: 'zz7', id: 7, count: 7}
        ]
function groupById (a) {
  let tempArr = []
  let resultArr = []
  if (a && a.length) {
    for (let i = 0, ilen = a.length; i < ilen; i++) {
    	let data = a[i]
      let fId = data.fencid
     	if (tempArr.indexOf(fId) === -1) {
        let obj = {fencid: data.fencid, userType: data.userType, name: data.name, id:data.id, children: []}
        resultArr.push(obj)
        tempArr.push(fId)
      }
    }
     for (let ii = 0, ilen = resultArr.length; ii < ilen; ii++) {
        let rId = resultArr[ii].fencid
         for (let iii = 0, ilen = a.length; iii < ilen; iii++) {
          let fId = a[iii].fencid             
          if (rId === fId) {
            resultArr[ii].children.push(a[iii])
          }
        }
     }
  }
  return resultArr
}

console.log(groupById(a))


function gruopByAttr(a) {
  let tempArr = []
  let resultArr = []
  if (a && a.length) {
    for (let i = 0, ilen = a.length; i < ilen; i++) {
      let fId = a[i].fencid
      if (tempArr.indexOf(fId) === -1) {
        a[i].children = []
        resultArr.push(a[i])
      }else {
        for (let ii = 0, ilen = resultArr.length; ii < ilen; ii++){
        	let ftId = resultArr[ii].fencid
          let data = resultArr[ii]
          if (ftId === fId) {
            resultArr[ii].children.push(a[i])           
          }
        }
      }
      tempArr.push(fId)
    }
  }
  return resultArr
}
let odata = gruopByAttr(a)
let odatas = countGroup(odata)


function countGroup (a) {
    if (a && a.length) {
      for (let i = 0, ilen = a.length; i < ilen; i++) {
        let t = a[i].userType        
        let c = a[i].count
        let len = a[i] && a[i].children && a[i].children.length
        for (let ii = 0; ii < len; ii++) {
          let tin = a[i].children[ii].userType          
          let cin = a[i].children[ii].count
          if (t === tin) {
            a[i].children[ii].count = cin + c
          }
        }
      }
    }
    return a
}

var a = [
          {fencid: 1, userType: '张三', name: 'zz1', id: 1, count: 1},          
  				{fencid: 2, userType: '张三', name: 'zz1', id: 1, count: 1},        
  				{fencid: 2, userType: '王二', name: 'zz2', id: 2, count: 2},
  				{fencid: 3, userType: '张三', name: 'zz3', id: 3, count: 3},
  				{fencid: 4, userType: '李四', name: 'zz4', id: 4, count: 4},
  				{fencid: 1, userType: '张三', name: 'zz5', id: 5, count: 5},
          {fencid: 2, userType: '赵二', name: 'zz6', id: 6, count: 6},
  				{fencid: 1, userType: '二麻子', name: 'zz7', id: 7, count: 7}
        ]
function groupsByUniq (a, t) {
  if (a && a.length) {
    let temp = []    
    let result = []
    for (let i = 0, ilen = a.length; i < ilen; i++) {
      let fid = a[i].fencid      
      let fty = a[i].userType
      if (t) {
        if (temp.indexOf(fty) === -1) {
          temp.push(fty)         
          result.push({fencid: fid, userType: fty, children: []})
        }
      } else {
        if (temp.indexOf(fid) === -1) {
          temp.push(fid)         
          result.push({fencid: fid, userType: fty, children: []})
        }
      }
    }
    for (let it = 0, ilen = result.length; it < ilen; it++) {
      let fid = t ? result[it][t] : result[it]['fencid']
      let tarr = []
      for (let i = 0, ilen = a.length; i < ilen; i++) {
        let _fid = t ? a[i][t] : a[i]['fencid']
        if (fid === _fid) {
          result[it].children.push(a[i])
        }
      }
    }
    return result
  }
}


let odata = groupsByUniq(a)
for (let i = 0, ilen = odata.length; i < ilen; i++) {
  let obj = odata[i].children
  let result = groupsByUniq(obj, 'userType')
  console.log(result)
}
  console.log(odata)
  
// function groupsByUniqCout (arr) {
//   if (arr && arr.length) {
//     let temp = []    
//     let result = []
//     for (let i = 0, ilen = arr.length; i < ilen; i++) {
//       let fid = arr[i].fencid      
//       result.push({fencid: fid, children: []})
//     }
//     for (let it = 0, ilen = arr.length; it < ilen; it++) {
//       let fid = arr[it]['fencid']
//       let child = arr[it].children
//       let temp = []    
//       for (let ci = 0, ilen = child.length; ci < ilen; ci++) {
//         let userType = child[ci].userType
//         let id = child[ci].id
//         if (temp.indexOf(userType) === -1) {
//           temp.push(userType)
//           // result[it].children.push(child[ci])
//       	} 
//         for (let in = 0, ilen = temp.length; in < ilen; in++) {
//           let t = temp[in]
//           let count = 0
//          	for (let cii = 0, ilen = child.length; cii < ilen; cii++) {
//          		let inuserType = child[cii].userType
//           	let inid = child[cii].id          	
//             let c = child[cii].count
//              if (t === inuserType) {
//                count += c
//              }
//         	}
//          	// result[it].children.push(child[ci])
//         }
//           console.log(userType)     
//       }
//     }
//                   console.log(result)                 
//   }
// }
  
  function  gruopByAttr (a) {
      let tempArr = []
      let resultArr = []
      if (a && a.length) {
        for (let i = 0, ilen = a.length; i < ilen; i++) {
          let fId = a[i].fenceId
          if (tempArr.indexOf(fId) === -1) {
            a[i].children = []
            resultArr.push(a[i])
          } else {
            for (let ii = 0, ilen = resultArr.length; ii < ilen; ii++) {
              let ftId = resultArr[ii].fenceId
              let data = resultArr[ii]
              if (ftId === fId) {
                resultArr[ii].children.push(a[i])
              }
            }
          }
          tempArr.push(fId)
        }
      }
      return resultArr
    }
      
 function   countGroup (a) {
      if (a && a.length) {
        for (let i = 0, ilen = a.length; i < ilen; i++) {
          let t = a[i].userType
          let c = a[i].clickCount
          let len = a[i] && a[i].children && a[i].children.length
          for (let ii = 0; ii < len; ii++) {
            let tin = a[i].children[ii].userType
            let cin = a[i].children[ii].clickCount
            if (t === tin) {
              a[i].children[ii].clickCount = cin + c
            }
          }
        }
      }
      return a
    }




console.log(odatas)
console 命令行工具 X clear

                    
>
console