現有一堆資料,我需要按時間進行分組,以便前端檢視呈現
[
{"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資料分組優化實踐](https://i.iter01.com/images/21216882d8a8d1a04b956cad4e2c0db9cafe8e88fc64fa2f8fac3c4fdcbdc23a.jpg)