扫码关注官方订阅号
有一数组,数组成员是对象,对象包括name和value两个属性。
先对所有数组成员按照value有大到小排序。
然后对value值一样的对象分组,分组内按照name的长度由短到长排序。
将各分组合并,重新得到一个整体按照value降序,value一样得按照字符串由短到长升序的一个对象数组
敢情赐教,怎么做效率比较高?
业精于勤,荒于嬉;行成于思,毁于随。
使用 Array.prototype.sort,传入一个比较函数,先按 value 比, 如果 value 相同再按 name 比较。写出来就是
Array.prototype.sort
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()
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
使用
Array.prototype.sort,传入一个比较函数,先按value比, 如果value相同再按name比较。写出来就是如果你觉得这个不太好理解,那就
我产生了一组随机数据用来测试,顺便把这段代码也贴出来
JS一般直接用自带的sort函数排序就行了,可以自定义比较函数的。
参考Array.prototype.sort()