分享一个用于数组或者对象的排序的函数。该函数可以以任意深度的数组或者对象的值作为排序基数对数组或的元素进行排序。

代码如下:

 /**
* 排序数组或者对象
* 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 排序数组或对象的更多相关文章

  1. JavaScript中数组和对象的使用例程

    JavaScript数组 下面的代码创建名为 cars 的数组: //方式一: var cars = new Array(); cars[0] = "Volvo"; cars[1] ...

  2. 整理JavaScript循环数组和对象的方法

    众所周知,常用的循环语句有for.while.do-while.for-in,forEach以及jQuery中提供的循环的方法:以及ES6中提供的很多用来循环对象的方法如map, 在 Javascri ...

  3. javaScript Es6数组与对象的实例方法

     个人心得 我们在没有接触Es6方法之前,做一些算法之类的事情是就比较麻烦,在做的过程中也要考虑很多的问题,比较麻烦,而Es6的方法正是来方便我们在平常运用时能够将问题简便化,大大的减少我们的日常代码 ...

  4. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  5. JavaScript学习总结(二)数组和对象部分

    pt学习总结(二)数组和对象部分 2016-09-16    分类:WEB开发.编程开发.首页精华暂无人评论     来源:trigkit4 分享到:更多1 对象部分 Object类型 Object  ...

  6. javascript之数组对象与数组常用方法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. JavaScript中数组Array.sort()排序方法详解

    JavaScript中数组的sort()方法主要用于对数组的元素进行排序.其中,sort()方法有一个可选参数.但是,此参数必须是函数. 数组在调用sort()方法时,如果没有传参将按字母顺序(字符编 ...

  8. JavaScript 浅析数组对象与类数组对象

    数组(Array对象) 数组的操作 创建数组方法 添加与修改数组元素 删除数组元素 使用数组元素 遍历数组元素 多维数组 数组相关的函数 concat() join() pop() push() sh ...

  9. JavaScript 数组(Array)对象的方法

    JavaScript 数组(Array)对象的方法 concat() 描述:用于连接两个或多个数组.该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本. 原型:arrayObject.conc ...

随机推荐

  1. Django 1.6 基于类的通用视图

    Django 1.6 基于类的通用视图 最初 django 的视图都是用函数实现的,后来开发出一些通用视图函数,以取代某些常见的重复性代码.通用视图就像是一些封装好的处理器,使用它们的时候只须要给出特 ...

  2. nginx的conf文件的详细配置

    #定义Nginx运行的用户和用户组user www www; #nginx进程数,建议设置为等于CPU总核心数.worker_processes 8; #全局错误日志定义类型,[ debug | in ...

  3. MYSQL 数据类型的 3 个注意

    注意 1. bit(Length) 这种数据类型中,最大长度只可以是64.就是说 bit(2)      对 bit(64)      对 bit(65)      错 bit(100)    错 注 ...

  4. 【python】bytearray和string之间转换,用在需要处理二进制文件和数据流上

    最近在用python搞串口工具,串口的数据流基本读写都要靠bytearray,而我们从pyqt的串口得到的数据都是string格式,那么我们就必须考虑到如何对这两种数据进行转换了,才能正确的对数据收发 ...

  5. 分享5个主流的HTML5开发工具

    HTML5被看做是web开发者创建流行web应用的利器,增加了对视频和Canvas 2D的支持.用HTML5的优点主要在于,这个技术可以进行跨平台的使用.比如你开发了一款HTML5的游戏,你可以很轻易 ...

  6. 从sample来学习Java堆(转)

    1)Java堆 所有对象的实例分配都在Java堆上分配内存,堆大小由-Xmx和-Xms来调节,sample如下所示: public class HeapOOM { static class OOMOb ...

  7. 【LeetCode练习题】Permutations

    全排列 Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the fo ...

  8. Android解决异常apk on device '0292bea1': Unable to open sync connection!

    方式一:使用手机管家(如腾讯手机管家,只要拖动发射火箭就行了)清理一下正在运行的后台程序. 方式二:把USB数据线拔了重新链接. 方法三:找到USB调试,关掉USB调试,然后重新开启.在设置 --&g ...

  9. Java基础:泛型

    Java的泛型是什么呢, 就是类型的參数化,这得类型包含方法參数和返回值.也就是原本该是确定类型的地方换成了变量,把类型的确定时间向后延迟了. 在之前,学过"重载"的概念,重载是什 ...

  10. 在 Mac OS X Lion 下修改 Hosts 的四种方法

    一名刚刚使用 Mac OS X Lion 系统的朋友问我怎么该系统下修改 Hosts 文件,说网上搜了很多办法都不管用,只要编辑 Hosts 文件就出现”你不是文件 hosts 的所有者,因此没有权限 ...