树排序

本文介绍了一种针对游戏职业树型数据的排序算法,通过使用sortObj和sortTreeData函数,可以对游戏职业的数据进行年龄字段的排序,支持正序和倒序,确保了数据的有序性和可读性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值