javascript - 请教一个算法问题,数组分组排序
迷茫
迷茫 2017-04-11 09:21:51
[JavaScript讨论组]

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

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

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

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

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

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(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()

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号