最近工作中遇到一个排序需求。
要求:将下面结构的数组对象按时间倒序排序,相同时间再根据级别正序排序,同一级别按照id正序排序。
let arrObj = [
{
time:'2',
TriageLevelL:'3'
id:12345
},
{
time:'5',
TriageLevelL:'4'
id:12111
},
{
time:'3',
TriageLevelL:'2'
id:12222
}
];
思路:“涉及到排序,首先想到的是冒泡排序,但是仅有冒泡排序还不够,因为'相同时间再根据级别正序排序',此时就将数组切割成几个小数组,把相同时间的部分单独拿出来利用冒泡排序,排完序后再按原顺序组装回去。”
// 把数组按照要排序的字段切割成几个小数组,然后再组装成一个数组
function sliceArr(arr_one, param) { // @param是要排序的参数
let timeOne = arr_one[0][param];
let startIndex = 0;
let arr9 = [];
arr_one.forEach((item, index, array) => {
if (timeOne !== item[param]) {
arr9.push(array.slice(startIndex, index));
startIndex = index;
timeOne = item[param];
}
if (index === array.length - 1) {
arr9.push(array.slice(startIndex, index + 1));
}
})
return arr9;
}
// 冒泡排序
function bubbleSort(arr, param, sort) { // @param是要排序的参数;@sort为true是正序,为false倒序
var length = arr.length;
for (var i = length - 1; i > 0; i--) {
for (var j = 0; j < i; j++) {
if (sort ? arr[j][param] > arr[j + 1][param] : arr[j][param] < arr[j + 1][param]) {
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
// 第一步:按照时间倒序排列
bubbleSort(arrObj, "time", false);
// 第二步:分割数组,时间相同的组在一起
let arr2 = sliceArr(arrObj, "time");
// 第三步:时间相同的部分按照级别正序排列
arr2.forEach((item, index, array) => {
if (item.length > 1) {
bubbleSort(item, "TriageLevelL", true);
}
})
// 第四步:再分割数组,级别相同的组在一起
let arr3 = arr2.map((item) => {
return sliceArr(item, "TriageLevelL");
})
// 第五步:级别相同的部分按照id正序排列
arr3.forEach((item) => {
item.forEach((item1) => {
if (item1.length > 1) {
bubbleSort(item1, "id", true);
}
})
})
// 第六步:拉平数组
let result = arr3.flat(2);
console.log(result);