Javascript 排序数组或对象
分享一个用于数组或者对象的排序的函数。该函数可以以任意深度的数组或者对象的值作为排序基数对数组或的元素进行排序。
代码如下:
/**
* 排序数组或者对象
* by Jinko
* date 2015-12-23
* @param object 数组或对象
* @param subkey 需要排序的子键, 该参数可以是字符串, 也可以是一个数组
* @param desc 排序方式, true:降序, false|undefined:升序
* @returns {*} 返回排序后的数组或者对象
*
* 注意: 对于对象的排序, 如果使用console.log打印对象的显示可能和排序结果不一致,
* 其键会被浏览器以字母顺序排序显示,但在for循环中则为正确的排序顺序
*/
function sort_object(object, subkey, desc)
{
var is_array = false; if(Object.prototype.toString.call(object) === '[object Array]') {
is_array = true;
} if(is_array) {
var keys = {length:object.length};
} else {
if(typeof(Object.keys) == 'function') {
var keys = Object.keys(object);
} else{
var keys = [];
for(var key in keys) {
keys.push(key);
}
}
} for(var i=0; i<keys.length; i++) {
for(var j=i+1; j<keys.length; j++) { if(is_array) {
//数组排序
if(Object.prototype.toString.call(subkey) === '[object Array]') {
var vali = object[i];
var valj = object[j]; for(var si=0; si<subkey.length; si++) {
vali = vali[ subkey[si] ];
valj = valj[ subkey[si] ];
}
} else {
if((!subkey && subkey !== 0) || subkey == '' && object.sort) {
var vali = object[i];
var valj = object[j];
} else {
var vali = object[i][subkey];
var valj = object[j][subkey];
}
} if(desc) {
if(valj > vali) {
var tmp = object[i];
object[i] = object[j];
object[j] = tmp;
}
} else {
if(valj < vali) {
var tmp = object[i];
object[i] = object[j];
object[j] = tmp;
}
}
} else {
//对象排序
var obi = object[ keys[i] ];
var obj = object[ keys[j] ]; if(Object.prototype.toString.call(subkey) === '[object Array]') {
var vali = obi;
var valj = obj; for(var si=0; si<subkey.length; si++) {
vali = vali[ subkey[si] ];
valj = valj[ subkey[si] ];
}
} else {
if((!subkey && subkey !== 0) || subkey == '' && object.sort) {
var vali = obi;
var valj = obj;
} else {
var vali = obi[subkey];
var valj = obj[subkey];
}
} if(desc) {
if(valj > vali) {
var tmp = keys[i];
keys[i] = keys[j];
keys[j] = tmp;
}
} else {
if(valj < vali) {
var tmp = keys[i];
keys[i] = keys[j];
keys[j] = tmp;
}
}
}//is!array
}
} if(is_array) {
return object;
} else {
var sorted = {}; for(var i=0; i<keys.length; i++) {
sorted[ keys[i] ] = object[ keys[i] ];
} return sorted;
}
} //sort_object
用法如下:
用法1:
var data = {
"a": {
"session_offline": 21,
"session_online": 6,
"session_count": 1
},
"b": {
"session_offline": 15,
"session_online": 5,
"session_count": 1
},
"c": {
"session_offline": 6,
"session_online": 1,
"session_count": 1
},
"d": {
"session_offline": 2,
"session_online": 0,
"session_count": 1
}
};
//根据session_online字段升序排序
data = sort_object(data, 'session_online');
for(var k in data) {
console.log(data[k]);
}
console.log('------------------');
//根据session_offline字段降序排序
data = sort_object(data, 'session_offline', true);
for(var k in data) {
console.log(data[k]);
}
用法2:
var data2 = [
{
"cpu": 24,
"cpuhz": 2099,
"cpuhz_use": 1322,
},
{
"cpu": 24,
"cpuhz": 2099,
"cpuhz_use": 694,
},
{
"cpu": 24,
"cpuhz": 2099,
"cpuhz_use": 1622,
},
{
"cpu": 24,
"cpuhz": 2099,
"cpuhz_use": 322,
}
]; //根据cpuhz_use字段进行排序
data2 = sort_object(data2, 'cpuhz_use'); console.log(data2);
用法3:
var data3 = [1,3,2,5,9,7,3,7]; //对一维数组进行升序排序
data3 = sort_object(data3);
console.log(data3); //对一维数组进行降序排序
data3 = sort_object(data3, null, true);
console.log(data3);
用法4:
var data4 = {'a':45, 'b':36, 'c':11, 'd':32};
//对对象进行升序排序
data4 = sort_object(data4);
//对对象进行降序排序
data4 = sort_object(data4, '', true);
for(var k in data4) {
console.log(k, ':', data4[k]);
}
用法5:
var data5 = {
"l1_1": {
"l2": {
"l3": 1
}
},
"l1_2": {
"l2": {
"l3": 3
}
},
"l1_3": {
"l2": {
"l3": 2
}
},
"l1_4": {
"l2": {
"l3": 4
}
}
};
//对对象元素的l2下的l3的值为基础进行升序排序
data5 = sort_object(data5, ['l2', 'l3']);
for(var k in data5) {
console.log(data5[k].l2);
}
用法6:
var data6 = [
[
{
"a": 1
},
2,
3
],
[
{
"a": 6
},
4,
7
],
[
{
"a": 0
},
1,
6
]
]; //对数组的元素以下标为0的元素的键名为a的值为基础进行升序排序
data6 = sort_object(data6, [0,'a']); for(var k = 0; k<data6.length; k++) {
console.log(data6[k]);
} console.log('---------------------'); //对数组的元素以下标为2的元素的值为基础进行升序排序
data6 = sort_object(data6, [2]); // 等价于 data6 = sort_object(data6, 2); for(var k = 0; k<data6.length; k++) {
console.log(data6[k]);
}
Javascript 排序数组或对象的更多相关文章
- JavaScript中数组和对象的使用例程
JavaScript数组 下面的代码创建名为 cars 的数组: //方式一: var cars = new Array(); cars[0] = "Volvo"; cars[1] ...
- 整理JavaScript循环数组和对象的方法
众所周知,常用的循环语句有for.while.do-while.for-in,forEach以及jQuery中提供的循环的方法:以及ES6中提供的很多用来循环对象的方法如map, 在 Javascri ...
- javaScript Es6数组与对象的实例方法
个人心得 我们在没有接触Es6方法之前,做一些算法之类的事情是就比较麻烦,在做的过程中也要考虑很多的问题,比较麻烦,而Es6的方法正是来方便我们在平常运用时能够将问题简便化,大大的减少我们的日常代码 ...
- javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈
Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...
- JavaScript学习总结(二)数组和对象部分
pt学习总结(二)数组和对象部分 2016-09-16 分类:WEB开发.编程开发.首页精华暂无人评论 来源:trigkit4 分享到:更多1 对象部分 Object类型 Object ...
- javascript之数组对象与数组常用方法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JavaScript中数组Array.sort()排序方法详解
JavaScript中数组的sort()方法主要用于对数组的元素进行排序.其中,sort()方法有一个可选参数.但是,此参数必须是函数. 数组在调用sort()方法时,如果没有传参将按字母顺序(字符编 ...
- JavaScript 浅析数组对象与类数组对象
数组(Array对象) 数组的操作 创建数组方法 添加与修改数组元素 删除数组元素 使用数组元素 遍历数组元素 多维数组 数组相关的函数 concat() join() pop() push() sh ...
- JavaScript 数组(Array)对象的方法
JavaScript 数组(Array)对象的方法 concat() 描述:用于连接两个或多个数组.该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本. 原型:arrayObject.conc ...
随机推荐
- python cmd模块练习
# encoding=utf-8 import cmd import sys # cmd模块练习 class Client(cmd.Cmd): ''' 1)cmdloop():类似与Tkinter的m ...
- 反调试技术(Delphi版)
1.程序窗口句柄检测原理:用FindWindow函数查找具有相同窗口类名和标题的窗口,如果找到就说明有OD在运行//****************************************** ...
- Check .NET Version with Inno Setup
原文 http://www.kynosarges.org/DotNetVersion.html Inno Setup by Jordan Russell is a great installation ...
- Inno Setup 网页显示插件 webctrl (V2.1 版本)
原文 http://restools.hanzify.org/article.asp?id=90 Inno Setup网页显示插件 webctrl能够显示所有 IE 中能够显示的东西. 引用内容 ; ...
- JavaEE Tutorials (26) - 批处理
26.1批处理介绍391 26.1.1批处理作业中的步骤391 26.1.2并行处理392 26.1.3状态和判定元素392 26.1.4批处理框架功能39326.2Java EE中的批处理394 2 ...
- https://pta.patest.cn/pta/test/15/exam/3/question/724
List Reverse( List L ){ if(L==NULL) return; List head=(List)malloc(sizeof(struct Node)); head->Ne ...
- linux之SQL语句简明教程---ALTER TABLE
在表格被建立在资料库中后,我们常常会发现,这个表格的结构需要有所改变.常见的改变如下: 加一个栏位 删去一个栏位 改变栏位名称 改变栏位的资料种类 以上列出的改变并不是所有可能的改变.ALTER TA ...
- linux动态库加载RPATH, RUNPATH
摘自http://gotowqj.iteye.com/blog/1926771 linux动态库加载RPATH, RUNPATH 链接动态库 如何程序在连接时使用了共享库,就必须在运行的时候能够找到共 ...
- x/nfu-用gdb查看内存
用gdb查看内存 2007-12-08 12:43 用gdb查看内存 格式: x /nfu <addr> 说明x 是 examine 的缩写 n表示要显示的内存单元的个数 f表示显示方式, ...
- C#委托的异步调用【转】
本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: ); //模拟该方法运 ...