var data = [
{
name: '鬼剑士',
id: 'aaa',
age: 33,
children: [
{
name: '红狗',
age: 666,
id: '111'
},
{
name: '瞎子',
id: '222',
age: 9999,
children: [
{
name: '吾为天帝,当镇世间一切敌!',
id: '2222-1'
}
]
},
{
name: '鬼泣',
age: 99999,
id: '333'
},
{
name: '剑魂',
age: 99,
id: '444'
}
]
},
{
name: '神枪手',
age: 44,
id: 'bbb'
},
{
name: '格斗家',
age: 55,
id: 'ccc'
},
{
name: '魔法师',
age: 16,
id: 'ddd'
},
{
name: '暗夜使者',
id: 'eee'
},
];
/**
* @desc 对象排序
* @param data 对象数组
* @param field 排序字段
* @param orderby true:倒序; false: 正序
*/
function sortObj(data, field, orderby) {
var empty = [], notEmpty = [];
_.each(data, function (item) {
if (item.hasOwnProperty(field) && hasValue(item[field],true)) {
notEmpty.push(item)
} else {
empty.push(item)
}
});
var afterSort = notEmpty.sort(function (a, b) {
if (!a.hasOwnProperty(field) || !b.hasOwnProperty(field)) {
if (!orderby) {
return -1
}
return 1
}
if(a[field] === Infinity && b[field] === Infinity){
if (!orderby) {
return -1
}
return 1
}
if (!orderby) {
if (isNaN(a[field] - b[field])) {
return a[field].localeCompare(b[field], "zh");
} else {
return a[field] - b[field]
}
} else {
if (isNaN(a[field] - b[field])) {
return b[field].localeCompare(a[field], "zh");
} else {
return b[field] - a[field]
}
}
});
if (orderby) {
return empty.concat(afterSort)
}
return afterSort.concat(empty)
}
/**
* @desc 树型数据排序
* @param field 根据哪个字段排序
* @param orderby 排序顺序 0: 从小到大。 1:从大到小
*/
function sortTreeData(data, field, orderby) {
data = sortObj.apply(this, arguments);
_.each(data, function (item) {
if (item.hasOwnProperty('children')) {
item.children = sortTreeData(item.children, field, orderby)
}
});
return data
}
data2 = sortTreeData(data, 'age', 0);