javascript - 请教一个算法问题,数组分组排序

查看:75
本文介绍了javascript - 请教一个算法问题,数组分组排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

有一数组,数组成员是对象,对象包括name和value两个属性。

  1. 先对所有数组成员按照value有大到小排序。

  2. 然后对value值一样的对象分组,分组内按照name的长度由短到长排序。

  3. 将各分组合并,重新得到一个整体按照value降序,value一样得按照字符串由短到长升序的一个对象数组

敢情赐教,怎么做效率比较高?

解决方案

使用 Array.prototype.sort,传入一个比较函数,先按 value 比, 如果 value 相同再按 name 比较。写出来就是

const result = data.sort((a, b) => {
    return (a.value - b.value)
        || (a.name.length - b.name.length)
        || (a.name < b.name ? -1 : (a.name > b.name ? 1 : 0));
});

如果你觉得这个不太好理解,那就

data.sort((a, b) => {
    const diff = a.value - b.value;
    if (diff !== 0) {
        return diff;
    } else {
        cosnt lenDiff = a.name.length - b.name.length;
        if (lenDiff !== 0) {
            return lenDiff;
        }
        return a.name < b.name
            ? -1
            : (a.name > b.name ? 1 : 0);
    }
})


我产生了一组随机数据用来测试,顺便把这段代码也贴出来

const data = (function() {
    const CHARS = "abcdefghijklmnopqrstuvwxyz";
    const data = [];

    for (var i = 0; i < 10; i++) {
        const value = 100 + Math.floor(Math.random() * 100);
        const count = 3 + Math.floor(Math.random() * 5);
        for (var j = 0; j < count; j++) {
            data.push(createObject(value));
        }
    }

    function createObject(value) {
        const len = 3 + Math.floor(Math.random() * 7);
        const chars = [];
        for (var i = 0; i < len; i++) {
            chars[i] = CHARS[Math.floor(Math.random() * 26)];
        }

        return {
            name: chars.join(""),
            value: value
        };
    }
    return data;
})();

这篇关于javascript - 请教一个算法问题,数组分组排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆