如何按嵌套orderId参数值对JavaScript对象的属性进行排序
你只需要修改sort方法的排序规则,让它对比两个键对应对象的orderId字段值即可,修改后的函数如下:
function sortObject(obj) { return Object.keys(obj) .sort((a, b) => obj[a].orderId - obj[b].orderId) .reduce((acc, key) => { acc[key] = obj[key]; return acc; }, {}); }
说明
- 原生
sort()不传参时默认会将元素转为字符串,按Unicode编码顺序排序,因此原本的实现是按键名字符串排序 - 传入的自定义比较函数会根据两个键对应对象的
orderId数值差决定排序顺序:差为负数时前者排在前面,正数时后者排在前面,刚好实现按orderId从小到大排序 - ES6及之后的标准中,普通对象的字符串键会严格按照插入顺序保存,因此reduce遍历排序后的键插入得到的新对象就符合你预期的顺序
如果需要兼容部分子项不存在orderId的场景,可以给orderId加兜底默认值,比如将排序规则改为:
.sort((a, b) => (obj[a].orderId ?? Infinity) - (obj[b].orderId ?? Infinity))
这样没有orderId字段的子项会自动排到末尾。
内容的提问来源于stack exchange,提问作者The Old County
相关产品推荐
相关产品推荐

