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

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

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

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

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

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

阅读 5.2k
3 个回答

使用 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;
})();
array.sort((a, b) => (b.value - a.value) * 1000 + (a.name - b.name));

JS一般直接用自带的sort函数排序就行了,可以自定义比较函数的。

参考Array.prototype.sort()

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题