码迷,mamicode.com
首页 > 编程语言 > 详细

js分组排序算法, OrderBy

时间:2016-09-27 15:05:53      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

由于项目中需要对数据进行分组排序,类似于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 sorttype = type || ‘asc‘;
          var results = [];
          var totalSum = {};

          function grouporder(source, orders, totalSum) {

            source.sort(function(a, b) {
              if (sorttype.toUpperCase() == ‘ASC‘) {
                return a[orders[0]] - b[orders[0]];
              } else {
                return b[orders[0]] - a[orders[0]];
              }
            })

            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, orders, 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: ‘足球‘
        },

      ]

 

js分组排序算法, OrderBy

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!