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: '足球'
},
]
js分组排序算法, OrderBy的更多相关文章
- JS的排序算法
排序是最基本的算法(本文排序为升序Ascending),常见的有以下几种: 1.冒泡排序 Bubble Sort 2.选择排序 Selection Sort 3.插入排序 Insertion Sort ...
- List对象分组排序算法
场景: List里面的对象是订单的节点,比如我们快递的物流状态,这个是需要有序的,所以需要根据订单号进行分组排序. import java.util.ArrayList; import java.ut ...
- JS常见排序算法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- js 实现排序算法 -- 快速排序(Quick Sort)
原文: 十大经典排序算法(动图演示) 快速排序 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整 ...
- js 实现排序算法 -- 归并排序(Merge Sort)
原文: 十大经典排序算法(动图演示) 归并排序 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得 ...
- js 实现排序算法 -- 插入排序(Insertion Sort)
原文: 十大经典排序算法(动图演示) 插入排序 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描, ...
- js 实现排序算法 -- 希尔排序(Shell Sort)
原文: 十大经典排序算法(动图演示) 希尔排序 1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版.它与插入排序的不同之处在于,它会优先比较距离较远的元素.希尔排序又叫缩 ...
- js 实现排序算法 -- 冒泡排序(Bubble Sort)
原文: 十大经典排序算法(动图演示) 冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来.走访数列的工作 ...
- js 实现排序算法 -- 选择排序(Selection Sort)
原文: 十大经典排序算法(动图演示) 选择排序(Selection Sort) 选择排序(Selection-sort)是一种简单直观的排序算法.它的工作原理:首先在未排序序列中找到最小(大)元素,存 ...
随机推荐
- wordpress网站被挂马以及防御方法
wordpress本身的安全性是非常的高的,一般不会被轻易的破解,被挂马,但是我们也不能够过度迷信wordpress的安全性,凡是连接上互联网的服务器和电脑,都存在被破解的风险性.所以我们在日常维护自 ...
- The C++ Standard Library --- A Tutorial Reference 读书笔记
5.2 Smart Pointer(智能指针) shared_ptr的aliasing构造函数,接受一个shared pointer和一个raw pointer.它允许你掌握一个事实:某对象拥有另一个 ...
- Java可变长参数方法调用问题
不说废话,直接上代码: package mytest; import java.util.List; public class TestClass { public void method(List& ...
- Linux上部署Tomcat(包括JAVA环境的配置)
一. 用FTP工具,把apache-tomcat-7.0.64.tar.gz,jdk-7u79-linux-x64.tar.gz 上传到目录/home/zwl/Tomcat/命令下 因为Tomcat运 ...
- ubuntu-E:Encountered a section with no Package: header的解决办法
刚才打开ubuntu,我的版本是12.04.正想使用sudo apt-get install build-essential 时,出现了如下错误: E:Encountered a section wi ...
- WebDriver使用指南(完整篇)
第1章 入门 1.1 下载selenium2.0的lib包 http://code.google.com/p/selenium/downloads/list 官方UserGuide: ...
- 周赛-kiki's game 分类: 比赛 2015-08-02 09:24 7人阅读 评论(0) 收藏
kiki's game Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 40000/10000 K (Java/Others) Total S ...
- yum mysql on centos 7
参考:https://www.linode.com/docs/databases/mysql/how-to-install-mysql-on-centos-7 centos 7上没有办法使用yum i ...
- CentOS 5/6.X 使用 EPEL YUM源
参考:http://www.linuxidc.com/Linux/2013-08/88523.htm 大纲 一.什么是EPEL? 二.与163 YUM源比较 三.CentOS 5.X 安装使用EPEL ...
- javaWeb项目命名规范
一.项目结构 这里和其他项目区别不大,我将模板抽离出来,更容易分析和理解: 解释一下:js主要包括extends(引入第三方的js).module(项目模块自己的js).lib(引用包,这里也可以继续 ...