javascript - 请教一个算法问题,数组分组排序
本文介绍了javascript - 请教一个算法问题,数组分组排序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
有一数组,数组成员是对象,对象包括name和value两个属性。
先对所有数组成员按照value有大到小排序。
然后对value值一样的对象分组,分组内按照name的长度由短到长排序。
将各分组合并,重新得到一个整体按照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屋!
查看全文