數組對象通過裏面對象的某個屬性分組或者分組彙總

源數據:

[{
  date: '2018-02',
  recordCharts: [{typeName: '小修',totalCount: 10},{
    typeName: '一保',totalCount: 20},{
    typeName: '二保',totalCount: 30}]
},{
  date: '2019-02',
  recordCharts: [{typeName: '小修',totalCount: 40},{
    typeName: '一保',totalCount: 50},{
    typeName: '二保',totalCount: 60}]
}]

目標數據:

[{name: '一保',value: [20, 50]},{
  name: '二保',value: [30, 60]},{
  name: '小修',value: [10, 40]
}]

首先我們可以看到,源數據是一個二維的數組對象,而目標數據是一個一維的數組對象。

那麼我們可以將目標數組轉成一箇中間數據之後,這個中間數據如下:

[{typeName: '小修',totalCount: 10},{
  typeName: '一保',totalCount: 20},{
  typeName: '二保',totalCount: 30},{
  typeName: '小修',totalCount: 40},{
  typeName: '一保',totalCount: 50},{
  typeName: '二保',totalCount: 60
}]

我們可以很清楚的看到,這個中間數據就是將源數據中的 recordCharts 下的每一項都放入了一個新數組中,這樣源數據就轉換的中間數據了,實現如下:

function firstHandle(arr){
  let newArr = []
  let dateArr = []
  arr.forEach(item => {
      if(item.recordCharts.length) {
          newArr.push(item.recordCharts)
      }
      dateArr.push(item.date)        
  })
  return { newArr: [].concat.apply([], newArr), dateArr }
}

接下來我們可以看到中間數據和目標數據之間,就是根據  typeName 的值,對同一屬性下值相同的 totalCount 放到同一個數組中進行分類,實現如下:

function dataHandle( myResIdArr ) {
  let map = {}, resDest = [];//map爲標杆對象(可以理解爲歸類工具),resDest爲處理後 最終滿足需求的數據集合,resDest[i].data即爲該大類下的數據
  for(let i = 0; i < myResIdArr.length; i++){
    let ai = myResIdArr[i];
    if(!map[ai.typeName]){
      //此處push插入的數據結構可根據需求,自我定製
      resDest.push({
        name: ai.typeName,//按“typeName”屬性,將該屬性值相同的歸爲一類
        value: [ai.totalCount]//該大類下的數據list,(ai.totalCount)需要什麼數據就放入什麼
      });
      map[ai.typeName] = ai;
    }else{
      for(let j = 0; j < resDest.length; j++){
        let dj = resDest[j];
        if(dj.name== ai.typeName){
          dj.value.push(ai.totalCount);
          break;
        }
      }
    }
  }
  return resDest //resDest[i].totalCount即爲resDest[i].typeName該大類下的數據list,遍歷渲染即可
} 

 

發佈了85 篇原創文章 · 獲贊 37 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章