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

代码如下:

 /**
* 排序数组或者对象
* 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. 用JavaScript将数字转换为大写金额

    var digitUppercase = function(n) { var fraction = ['角', '分']; var digit = [ '零', '壹', '贰', '叁', '肆', ...

  2. UDP包的大小与MTU

    在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好?当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,我这里仅对像ICQ一类的发送聊天消息的情况作分 ...

  3. c# excel sheep 导出

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Da ...

  4. hdu 5616 Jam's balance(dp 正反01背包)

    来自官方题解: AC代码: #pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream ...

  5. hdu 5510 Bazinga(暴力)

    Problem Description Ladies and gentlemen, please sit up straight. Don't tilt your head. I'm serious. ...

  6. bash 学习笔记(一)

    尽量使用printf而不要用echo(echo再不同情况下语义不同) 整数%d,小数后6位%f,科学计数法 %e,16进制 %x 宽度限制 %8s %-15s 正数朝右对齐 负数朝左对齐:%04d\n ...

  7. Android EditText限制输入一些固定字符的属性

    android:digits="abcdefghijklmnopqrstuvwxyz1234567890" 仅仅能输入这些

  8. OAuth2.0授权机制说明

    授权机制说明   1 简介 优酷对第三方应用用户授权采用OAuth2.0标准 2 OAuth2.0 授权方式 优酷支持OAuth 2.0的三种授权方式,请根据平台选用不同的授权方式: 2.1 通用授权 ...

  9. Top k问题(线性时间选择算法)

    问题描述:给定n个整数,求其中第k小的数. 分析:显然,对所有的数据进行排序,即很容易找到第k小的数.但是排序的时间复杂度较高,很难达到线性时间,哈希排序可以实现,但是需要另外的辅助空间. 这里我提供 ...

  10. Android Studio无法关联Api23源码-提示Souces for android api 23 platform not found

    最近升级了As,然后忽然就关联不上源码了,很不方便,找个Activity的源码都只有outline没有解释,还提示这个错误: Decompiled .class file, bytecode vers ...