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

代码如下:

 /**
* 排序数组或者对象
* 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. 如何让用户在用webview访问网页时嵌入我们自己的内容

    代码如下:        NSString *strUrl=[textField text];    NSString *urlString=[NSString stringWithFormat:st ...

  2. [置顶] lvs-tun隧道模式搭建

    一.lvs直接路由原理 由于图片还要一张一张上传,可以到下面网站下载我的word版本: http://download.csdn.net/user/y0908105023 补充基础知识: OSI(Op ...

  3. java设计模式--行为型模式--命令模式

    命令模式 概述 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤消的操作. 适用性 .抽象出待执行的动作以参数化某对象. .在不同的时刻指定.排 ...

  4. 栈ADT的链表实现

    /* 栈ADT链表实现的类型声明 */ struct Node; typedef struct Ndoe *PtrToNode; typedef PtrToNode Stack; struct Nod ...

  5. #include <bitset>

    1 none();测试是否有越位 2 reset();全部清零 3 set(7, 0);把第7个字符改成0,操作二进制位 4 to_string();转换为字符串 5 to_ulong();转换为无符 ...

  6. Longtail Hedgehog(DP)

    Longtail Hedgehog time limit per test 3 seconds memory limit per test 256 megabytes input standard i ...

  7. 济南最新公交线路一览(BRT)

    济南最新公交线路一览(BRT) 济南BRT1路 高速公交线路 黄岗路东5:30-21:30 全福立交桥西5:30-21:30 票价1元,刷卡9折,月票有效 高速公交公司 去程:黄岗路东(BRT) - ...

  8. Asp.Net(C#) MD5 加密

    /// <summary> /// MD5 字符串加密  /// </summary> /// <param name="str">需要加密的字 ...

  9. repeater 一个td多个div显示图片

    <table class="table table-bordered table-responsive"> <tbody> <asp:Repeater ...

  10. C#整理4——循环语句

    一.循环语句  定义:可以反复执行某段代码,直到不满足循环条件为止. 循环的四要素:初始条件.循环条件.状态改变.循环体. 1.初始条件:循环最开始的状态. 2.循环条件:在什么条件下进行循环,不满足 ...