如何按数值降序排序键名不统一的JavaScript对象数组
实现方法
你已经摸到正确思路了,只需要在sort的比较函数里,先动态取出每个对象对应的数值,再做降序比较即可,逻辑和固定键名的排序写法本质完全一致。
直接可用的代码如下:
let ungroupedArr = [ { Orange: 5 }, { Red: 575 }, { Green: 6544 }, { Blue: 1307 } ] const sortedArr = ungroupedArr.sort((a, b) => { // 直接取每个对象唯一的属性值 const valueA = Object.values(a)[0] const valueB = Object.values(b)[0] // 降序排序用 b - a,需要升序就反过来写 a - b return valueB - valueA })
逻辑说明
- 你之前已经想到用
Object.keys(element)[0]获取动态键名,这里用Object.values(element)[0]可以直接拿到对象唯一的属性值,省掉了通过键名二次索引取值的步骤。 Array.sort的比较函数不关心你怎么拿到要对比的数值,只要返回两个数值的差就能正确排序:固定键名时你写a.distance - b.distance,本质也是拿两个值做差,动态键只是换了个取值的方式而已。
如果你的业务场景里后续可能给对象加其他属性,需要固定取第一个键对应的值做排序,可以把取值逻辑换成你之前摸索出来的键名获取写法:
const sortedArr = ungroupedArr.sort((a, b) => { const keyA = Object.keys(a)[0] const keyB = Object.keys(b)[0] return b[keyB] - a[keyA] })
以上代码运行后得到的结果和你期望的完全一致:
[ { Green: 6544 }, { Blue: 1307 }, { Red: 575 }, { Orange: 5 } ]
内容的提问来源于stack exchange,提问作者InquisitiveTom
相关产品推荐
相关产品推荐

