Javascript中JSON資料分組優化實踐

xank發表於2017-12-21

現有一堆資料,我需要按時間進行分組,以便前端檢視呈現

[
  {"date":"2017-12-22","start_time":"10:00:00","end_time":"10:00:00","status":"Performance Time"},
  {"date":"2017-12-22","start_time":"10:40:00","end_time":"10:40:00","status":"Performance Time"},
  {"date":"2017-12-23","start_time":"10:00:00","end_time":"10:00:00","status":"Performance Time"},
  {"date":"2017-12-23","start_time":"10:40:00","end_time":"10:40:00","status":"Performance Time"}
]
複製程式碼

需轉化為如下

[
  {
    date: '2017-12-22',
    data: [
      {
        date: '2017-12-22',
        start_time: '10:00:00',
        end_time: '10:00:00',
        status: 'Performance Time'
      },
      {
        date: '2017-12-22',
        start_time: '10:40:00',
        end_time: '10:40:00',
        status: 'Performance Time'
      }
    ]
  },
  {
    date: '2017-12-23',
    data: [
      {
        date: '2017-12-23',
        start_time: '10:00:00',
        end_time: '10:00:00',
        status: 'Performance Time'
      },
      {
        date: '2017-12-23',
        start_time: '10:40:00',
        end_time: '10:40:00',
        status: 'Performance Time'
      }
    ]
  }
]

複製程式碼

1.原始方法,網路一大堆

  var map = {},
    nList = []
  //遍歷原始陣列
  for (var i = 0; i < arr.length; i++) {
    var item = arr[i]
    //如果map沒有則在新nList中新增
    if (!map[item.date]) {
      nList.push({
        date: item.date,
        data: [item]
      })
      map[item.date] = item
    } else {
      //遍歷nList
      for (var j = 0; j < nList.length; j++) {
        var nItem = nList[j]、
        //如查詢到date符合則新增
        if (nItem.date == item.date) {
          nItem.data.push(item)
          //跳出迴圈
          break
        }
      }
    }
  }
複製程式碼

執行效率:遍歷1000個約3ms,總覺得不優雅,而且沒用到ES5的特性,於是決定自己優化一下!

2.使用ES5特性

將for替換為forEach和every

  let map = {},
    nList = []
  arr.forEach((item) => {
    if (!map[item.date]) {
      nList.push({
        date: item.date,
        data: [item]
      })
      map[item.date] = item
    } else {
      //因為forEach不支援break,所以使用every實現
      nList.every((nItem) => {
        if (nItem.date === item.date) {
          nItem.data.push(item)
          return false
        }
        return true
      })
    }
  })
複製程式碼

效能優化50%,約1.5ms!

3.效能優化實踐

因為我的陣列中的date是按順序排列,而且沒有重複,這樣可以考慮去除第二個迴圈

  let map = {},
    nList = []
  //設定初始key為0
  let _nkey = 0
  arr.forEach((item, index) => {
    if (index === 0) {
      nList.push({
        date: item.date,
        data: [item]
      })
    } else {
      let oItem = arr[index - 1]
      //和前一個date一致則在當前新增,否則新增至nList
      if (item.date === oItem.date) {
        nList[_nkey]['data'].push(item)
      } else {
        nList.push({
          date: item.date,
          data: [item]
        })
        _nkey ++
      }
    }
  })
複製程式碼

效率再次優化50%,約1ms!

專案最終效果:

Javascript中JSON資料分組優化實踐

相關文章