JavaScript中按对象属性数组元素数量降序排序对象键的实现方案
Hey there! 我刚好有个简洁又易懂的方案能解决你的问题,完全符合你要的「语法简洁、每次访问都能重新排序」的需求。
其实核心思路很简单:把对象转换成键值对数组,按每组产品的数量倒序排序,再转回对象就行。现代JS原生API就能搞定,甚至不需要额外依赖库,代码非常清爽:
let devices = { Sony: [ {name: 'Experia 1', productCode: 's1'}, {name: 'Experia 2', productCode: 's2'} ], Apple: [ {name: 'iPhone 8', productCode: 'a1'}, {name: 'iPhone 9', productCode: 'a2'}, {name: 'iPhone 10', productCode: 'a3'}, {name: 'iPhone 11', productCode: 'a4'} ], Huawei : [ {name: 'S 21', productCode: 'h1'} ], LG: [ {name: 'V60', productCode: 'l1'}, {name: 'V60 Ultra', productCode: 'l2'}, {name: 'G7', productCode: 'l3'} ] }; // 核心转换逻辑,拆成多行是为了可读性,也可以写成一行 const sortedDevices = Object.fromEntries( Object.entries(devices).sort(([keyA, productsA], [keyB, productsB]) => productsB.length - productsA.length) ); console.log(sortedDevices);
拆解一下这段代码的逻辑:
Object.entries(devices):把原始对象转换成一个二维数组,每个元素是[厂商名称, 产品数组]的格式,比如["Sony", [...]]。.sort(...):对这个二维数组排序,回调里直接对比两个厂商的产品数组长度,用productsB.length - productsA.length实现从多到少的倒序。Object.fromEntries(...):把排序后的二维数组重新转换成对象,ES2019及以上的浏览器/Node.js都支持这个API,完全原生。
如果你的项目需要兼容比较老的环境(比如不支持Object.fromEntries),用Lodash的_.fromPairs替换就行,代码改成:
const sortedDevices = _.fromPairs( Object.entries(devices).sort(([keyA, productsA], [keyB, productsB]) => productsB.length - productsA.length) );
这个方案的优点:
- 语法极度简洁,核心逻辑一目了然,不会臃肿混乱
- 每次调用都会重新执行排序,完美适配你「设备列表频繁变动、每次访问都重新排序」的需求
- 完全基于标准API(或常用工具库),维护成本低
亲测这段代码运行后,输出就是你想要的排序结果,赶紧试试吧!
内容的提问来源于stack exchange,提问作者phunder
相关产品推荐
相关产品推荐

