实现一个排序需求

264 阅读1分钟

最近工作中遇到一个排序需求。
要求:将下面结构的数组对象按时间倒序排序,相同时间再根据级别正序排序,同一级别按照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);