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)是一种简单直观的排序算法.它的工作原理:首先在未排序序列中找到最小(大)元素,存 ...
随机推荐
- PHP操作Memcache基本函数的方法
Memcache基本函数. Memcache ― Memcache类 Memcache::add ― 增加一个条目到缓存服务器 Memcache::addServer ― 向连接池中添加一个memca ...
- HDU 5795:A Simple Nim(博弈)
http://acm.hdu.edu.cn/showproblem.php?pid=5795 A Simple Nim Problem Description Two players take t ...
- Creating default object from empty value in PHP?
Your new environment may have E_STRICT warnings enabled in error_reporting if it is PHP <= 5.3, ...
- ado.net基础思想-abstract
抽象类用做基类不能被实例化用途是派生出其他非抽象类 接口主要是实现多重继承 abstract 修饰符用于表示所修饰的类是不完整的,并且它只能用作基类.抽象类与非抽象类在以下方面是不同的:• 抽象类不能 ...
- 20150625_Andriod_01_ListView1_条目显示
android listview 参考地址: http://www.cnblogs.com/zhengbeibei/archive/2013/05/14/3078805.html http://xy ...
- JAVA基础知识之网络编程——-使用MutilcastSocket实现多点广播
IP多点广播原理 设置一组特殊网络地址作为多点广播地址,每一个多点广播地址都被看作一个组,当客户需要发送和接受信息时,加入到该组即可. IP协议为多点广播提供了一批特殊的IP地址,范围是224.0.0 ...
- Java基础知识点
以下10点为JAVA 基础知识,后面将足以总结和完善以备面试 数据类型 (包装类,字符串,数组) 异常处理 Java IO和NIO 数据结构 (集合和容器 ) 多线程(并发) 网络通信(协议) 面向对 ...
- UML的概念模型
为 了理解UML,需要形成该语言的概念模型,这要求学习建模的3个要素:UML的基本构造块.支配这些构造块如何放在一起的规则和一些运用于整个UML的公 共机制.如果掌握了这些思想,就能够读懂UML模型, ...
- IIS WebForm开发基础
Winform是在客户电脑操作的. WebForm是客户机通过一个IP地址,到IIs服务器,再进行信息反馈,在非客户机上操作的. 一.WebForm 运行流程(1)需要访问数据库(aspx) 客户机打 ...
- MySQL中怎么对varchar类型排序问题
MySQL中怎么对varchar类型排序问题 在mysql默认order by 只对数字与日期类型可以排序,但对于varchar字符型类型排序好像没有用了,下面我来给各位同学介绍varchar类型排序 ...