如何按orderId对包含数组的复杂对象fruitFrom进行排序?
按orderId排序对象键的解决方案
你遇到的报错核心原因是:fruitFrom是普通对象,不是数组,所以没有sort()方法,而且你尝试的a[0]也无从谈起——对象本身不能直接被sort遍历,自然取不到a[0]的orderId。
要实现按每个水果对应的orderId排序对象的键,需要先把对象转换成可排序的数组,处理后再转回对象,具体步骤如下:
- 把对象转成键值对数组:用
Object.entries()方法,将fruitFrom转换成[['apple', 数组], ['pineapple', 数组]]这样的结构 - 对数组排序:排序时取每个数组项的第二个元素(即水果对应的数组)的第一个元素的
orderId,以此作为排序依据 - 把排序后的数组转回对象:用
Object.fromEntries()方法还原成对象结构
完整代码如下:
const fruitFrom = { apple: [ { 'country': 'U.S', 'orderId': 2 }, { 'country': 'France', 'orderId': 2 } ], pineapple: [ { 'country': 'U.S', 'orderId': 1 }, { 'country': 'Italy', 'orderId': 1 } ] }; // 转换为键值对数组并排序 const sortedEntries = Object.entries(fruitFrom).sort((a, b) => { // a[1]是apple对应的数组,a[1][0]是数组里的第一个对象,取它的orderId return a[1][0].orderId - b[1][0].orderId; }); // 转回对象 const sortedFruitFrom = Object.fromEntries(sortedEntries); console.log(sortedFruitFrom);
运行后就能得到你期望的结果:
{ pineapple: [ { 'country': 'U.S', 'orderId': 1 }, { 'country': 'Italy', 'orderId': 1 } ], apple: [ { 'country': 'U.S', 'orderId': 2 }, { 'country': 'France', 'orderId': 2 } ] }
注意:ES6及以上版本支持Object.entries()和Object.fromEntries(),如果你的环境存在兼容问题,可以用for...in遍历对象的方式实现,但这两个方法是目前最简洁的实现方式。
内容的提问来源于stack exchange,提问作者yobee310
相关产品推荐
相关产品推荐

