JavaScript對象數(shù)組排序函數(shù)及六個用法
分享一個用于數(shù)組或者對象的排序的函數(shù)。該函數(shù)可以以任意深度的數(shù)組或者對象的值作為排序基數(shù)對數(shù)組或的元素進(jìn)行排序。
代碼如下:
/**
* 排序數(shù)組或者對象
* by Jinko
* date --
* @param object 數(shù)組或?qū)ο?
* @param subkey 需要排序的子鍵, 該參數(shù)可以是字符串, 也可以是一個數(shù)組
* @param desc 排序方式, true:降序, false|undefined:升序
* @returns {*} 返回排序后的數(shù)組或者對象
*
* 注意: 對于對象的排序, 如果使用console.log打印對象的顯示可能和排序結(jié)果不一致,
* 其鍵會被瀏覽器以字母順序排序顯示,但在for循環(huán)中則為正確的排序順序
*/
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=; i<keys.length; i++) {
for(var j=i+; j<keys.length; j++) {
if(is_array) {
//數(shù)組排序
if(Object.prototype.toString.call(subkey) === '[object Array]') {
var vali = object[i];
var valj = object[j];
for(var si=; si<subkey.length; si++) {
vali = vali[ subkey[si] ];
valj = valj[ subkey[si] ];
}
} else {
if((!subkey && subkey !== ) || 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=; si<subkey.length; si++) {
vali = vali[ subkey[si] ];
valj = valj[ subkey[si] ];
}
} else {
if((!subkey && subkey !== ) || 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=; i<keys.length; i++) {
sorted[ keys[i] ] = object[ keys[i] ];
}
return sorted;
}
} //sort_object
用法如下:
用法1:
var data = {
"a": {
"session_offline": ,
"session_online": ,
"session_count":
},
"b": {
"session_offline": ,
"session_online": ,
"session_count":
},
"c": {
"session_offline": ,
"session_online": ,
"session_count":
},
"d": {
"session_offline": ,
"session_online": ,
"session_count":
}
};
//根據(jù)session_online字段升序排序
data = sort_object(data, 'session_online');
for(var k in data) {
console.log(data[k]);
}
console.log('------------------');
//根據(jù)session_offline字段降序排序
data = sort_object(data, 'session_offline', true);
for(var k in data) {
console.log(data[k]);
}
用法2:
var data = [
{
"cpu": ,
"cpuhz": ,
"cpuhz_use": ,
},
{
"cpu": ,
"cpuhz": ,
"cpuhz_use": ,
},
{
"cpu": ,
"cpuhz": ,
"cpuhz_use": ,
},
{
"cpu": ,
"cpuhz": ,
"cpuhz_use": ,
}
];
//根據(jù)cpuhz_use字段進(jìn)行排序
data = sort_object(data, 'cpuhz_use');
console.log(data);
用法3:
var data = [,,,,,,,]; //對一維數(shù)組進(jìn)行升序排序 data = sort_object(data); console.log(data); //對一維數(shù)組進(jìn)行降序排序 data = sort_object(data, null, true); console.log(data);
用法4:
var data = {'a':, 'b':, 'c':, 'd':};
//對對象進(jìn)行升序排序
data = sort_object(data);
//對對象進(jìn)行降序排序
data = sort_object(data, '', true);
for(var k in data) {
console.log(k, ':', data[k]);
}
用法5:
var data = {
"l_": {
"l": {
"l":
}
},
"l_": {
"l": {
"l":
}
},
"l_": {
"l": {
"l":
}
},
"l_": {
"l": {
"l":
}
}
};
//對對象元素的l下的l的值為基礎(chǔ)進(jìn)行升序排序
data = sort_object(data, ['l', 'l']);
for(var k in data) {
console.log(data[k].l);
}
用法6:
var data = [
[
{
"a":
},
,
],
[
{
"a":
},
,
],
[
{
"a":
},
,
]
];
//對數(shù)組的元素以下標(biāo)為的元素的鍵名為a的值為基礎(chǔ)進(jìn)行升序排序
data = sort_object(data, [,'a']);
for(var k = ; k<data.length; k++) {
console.log(data[k]);
}
console.log('---------------------');
//對數(shù)組的元素以下標(biāo)為的元素的值為基礎(chǔ)進(jìn)行升序排序
data = sort_object(data, []); // 等價于 data = sort_object(data, );
for(var k = ; k<data.length; k++) {
console.log(data[k]);
}
以上內(nèi)容是小編給大家分享的JavaScript對象數(shù)組排序函數(shù)及六個用法的全部敘述,希望大家喜歡。
- js使用Array.prototype.sort()對數(shù)組對象排序的方法
- JS實(shí)現(xiàn)json對象數(shù)組按對象屬性排序操作示例
- js對象數(shù)組按屬性快速排序
- JS實(shí)現(xiàn)根據(jù)數(shù)組對象的某一屬性排序操作示例
- js中的數(shù)組對象排序分析
- JavaScript對象數(shù)組如何按指定屬性和排序方向進(jìn)行排序
- JS實(shí)現(xiàn)給數(shù)組對象排序的方法分析
- javascript 數(shù)組排序與對象排序的實(shí)例
- js 根據(jù)對象數(shù)組中的屬性進(jìn)行排序?qū)崿F(xiàn)代碼
- JavaScript對象數(shù)組排序?qū)嵗椒\析
- JS深入學(xué)習(xí)之?dāng)?shù)組對象排序操作示例
相關(guān)文章
javascript之典型高階函數(shù)應(yīng)用介紹二
在前一篇文章javascript之典型高階函數(shù)中主要實(shí)現(xiàn)了幾個典型的functional函數(shù),文章最后也提出了疑問,為啥那樣的實(shí)現(xiàn)與F#之類的函數(shù)式語言“不太一樣”呢?今天來試試更“函數(shù)式”的實(shí)現(xiàn)2013-01-01
10行原生JS實(shí)現(xiàn)文字無縫滾動(超簡單)
下面小編就為大家分享一篇10行原生JS實(shí)現(xiàn)文字無縫滾動的效果,特別簡單,具有很好的參考價值,希望對大家有所幫助2018-01-01
js判斷復(fù)選框是否選中及選中個數(shù)的實(shí)現(xiàn)代碼
下面小編就為大家?guī)硪黄猨s判斷復(fù)選框是否選中及選中個數(shù)的實(shí)現(xiàn)代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-05-05
基于Bootstrap的后臺管理面板 Bootstrap Metro Dashboard
這篇文章主要介紹了基于Bootstrap的后臺管理面板:Bootstrap Metro Dashboard,對Bootstrap的后臺管理面板感興趣的小伙伴們可以參考一下2016-06-06

