js分组排序算法, OrderBy

由于项目中需要对数据进行分组排序,类似于sql中 order by column1,column2...。 

实现的关键是 分组排序,第一个column1,排序完成之后,对其分组,然后按照column2 排序, 在分组。 以此类推。

下面给出实现:

/**
       * [orderBy description]
       * @param  {[type]} source [description]
       * @param  {[type]} orders [description]
       * @param  {[type]} type  {asc, desc}  [description]
       * @return {[type]}        [description]
       */
      orderBy(source, orders, type) {

        if (source instanceof Array && orders instanceof Array && orders.length > 0) {

          var ordersc = orders.concat([]);
          var sorttype = type || 'asc';
          var results = [];
          var totalSum = {};

          function grouporder(source, orders, totalSum) {

            source.sort(function(a, b) {
              var convertA = a[orders[0]];
              var convertB = b[orders[0]];
              if (typeof convertA == 'string' && typeof convertB == 'string') {
                if (sorttype.toUpperCase() == 'ASC') {
                  return convertA.localeCompare(convertB);
                } else {
                  return convertB.localeCompare(convertA);
                }
              } else {
                if (sorttype.toUpperCase() == 'ASC') {
                  return convertA - convertB;
                } else {
                  return convertB - convertA;
                }
              }

            })

            var groupmap = new Map();
            source.forEach((item) => {
              if (groupmap.has(item[orders[0]])) {
                groupmap.get(item[orders[0]]).push(item);
              } else {
                groupmap.set(item[orders[0]], []);
                groupmap.get(item[orders[0]]).push(item);
              }
            })



            orders.shift();

            for (let [key, val] of groupmap) {

              totalSum[key] = {};
              totalSum[key].name = key;
              totalSum[key].value = val.length;
              if (orders.length == 0) {
                results = results.concat(val);
              } else {
                totalSum[key].children = {};
                var orderscopy = orders.concat([]);
                grouporder(val, orderscopy, totalSum[key].children);
              }
            }
          }

          grouporder(source, ordersc, totalSum);

          return {
            results: results,
            totalSum: totalSum
          };
        } else {
          return source;
        }
      },

调用:

this.orderBy(arr, ['className'], 'desc')

测试数据:

[{
          className: '一班',
          name: '张三',
          sex: '女',
          age: 21,
          aihao: '足球'
        }, {
          className: '一班',
          name: '张三33',
          sex: '女',
          age: 21,
          aihao: '篮球'
        }, {
          className: '一班',
          name: '张三44',
          sex: '女',
          age: 21,
          aihao: '足球'
        }, {
          className: '一班',
          name: '张三55',
          sex: '女',
          age: 21,
          aihao: '篮球'
        }, {
          className: '一班',
          name: '张三1',
          sex: '男',
          age: 21,
          aihao: '篮球'
        }, {
          className: '一班',
          name: '张三2',
          sex: '男',
          age: 21,
          aihao: '足球'
        }, {
          className: '一班',
          name: '张三3',
          sex: '女',
          age: 21,
          aihao: '足球'
        },

        {
          className: '二班',
          name: '李四',
          sex: '女',
          age: 22,
          aihao: '足球'
        }, {
          className: '一班',
          name: '李四1',
          sex: '男',
          age: 23,
          aihao: '篮球'
        }, {
          className: '二班',
          name: '李四2',
          sex: '男',
          age: 24,
          aihao: '足球'
        }, {
          className: '一班',
          name: '李四3',
          sex: '女',
          age: 24,
          aihao: '足球'
        }, {
          className: '二班',
          name: '李四4',
          sex: '女',
          age: 26,
          aihao: '足球'
        }, {
          className: '一班',
          name: '李四5',
          sex: '男',
          age: 22,
          aihao: '篮球'
        }, {
          className: '二班',
          name: '李四6',
          sex: '男',
          age: 22,
          aihao: '足球'
        },

      ]
原文地址:https://www.cnblogs.com/btgyoyo/p/5912541.html