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)是一种简单直观的排序算法.它的工作原理:首先在未排序序列中找到最小(大)元素,存 ...
随机推荐
- Android推送方案分析(MQTT/XMPP/GCM)
本文主旨在于,对目前Android平台上最主流的几种消息推送方案进行分析和对比,比较客观地反映出这些推送方案的优缺点,帮助大家选择最合适的实施方案. 方案1. 使用GCM服务(Google Cloud ...
- codeigniter中base_url和site_url
首先在网站中使用如下的语句: site_url(‘manage/articleAdd’): 1 <?php echo site_url('manage/articleAdd');?> ba ...
- Apache2.2 + php-5.4.45-Win32-VC9-x86 配置
首先要注意一个问题是:网上有很多教程比如: 在Apache配置文件中添加php模块.在apache2\conf\httpd.conf中: LoadModule模块添加行: LoadModule php ...
- c语言中各个类型的sizeof长度
#include <stdio.h> int main() { printf("\nA Char is %lu bytes", sizeof( char )); ...
- hihoCoder 搜索一·24点
题目1 : 搜索一·24点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 周末,小Hi和小Ho都在家待着.在收拾完房间时,小Ho偶然发现了一副扑克,于是两人考虑用这副扑 ...
- JSP 资源与网站
JS文件说明 1.1 jquery 描述:一个兼容多浏览器的javascript框架,可以操作文档对象.选择DOM元素.制作动画效果.事件处理.使用Ajax以及其他功能. 文件路径:Commonjs/ ...
- 如果在遨游浏览器里设置Bing(必应)搜索为默认搜索
今天刚装了遨游浏览器,发现搜索引擎列表里没有Bing(必应)搜索的选项,就自己DIY了下. 步骤: 1. 在遨游搜索引擎列表管理里,添加一个新的搜索引擎项: Name:填写上”Bing(必应)“ (这 ...
- thinkphp 实现无限极分类
thinkphp实现无限极分类,获得所有的子类 今天学习测试了一上午也没有整出来,一开始一直没有办法把所有的子分类拿出来. 最后找到原因: 每次调用的时候没有在最后return的位置我没有选择retu ...
- itoa
功能:把int转为字符数组 eg: int a=100: char ch[3]; itoa(a,ch,10)://十进制 ---->ch[0]==1;...
- Python if条件语句
1. if 条件语句 if 条件: 内容1 内容2 else: 内容3 内容4 # 一个等号是赋值(=) # 两个等号是比较(==) #不等号(!=) #if 条件1 and 条件2(并且) #if ...