JavaScript:如何按rooms.price对嵌套对象数组进行升序排序?
JavaScript嵌套对象与数组的多维度排序实现
问题场景
需要对包含嵌套对象和数组的JavaScript对象进行排序,要求按所有房间的price升序排列:
- 每个
results数组内部的元素按rooms.price升序排序 - 外层对象的键值对按其对应
results数组中最小的price升序排序
原对象结构:
let object = { '2573': { results: [ { "rooms": { "price": 1500 } }, { "rooms": { "price": 1700 } } ], }, '2574': { results: [ { "rooms": { "price": 1800 } }, { "rooms": { "price": 1900 } } ], }, '2575': { results: [ { "rooms": { "price": 1850 } }, { "rooms": { "price": 1200 } } ], } };
之前尝试的object.sort(...)无效,原因是:
- JavaScript对象本身没有
sort方法,只有数组具备该方法 - 代码未正确访问到嵌套的
rooms.price属性
解决方案
分两步实现排序:
1. 排序每个results数组内部元素
遍历外层对象的每个值,对其results数组按rooms.price升序排序:
for (const key in object) { object[key].results.sort((a, b) => a.rooms.price - b.rooms.price); }
2. 排序外层对象
将外层对象转为[键, 值]格式的数组,根据每个值对应的results数组中最小的price排序,最后转回对象:
const sortedObject = Object.fromEntries( Object.entries(object).sort(([, valA], [, valB]) => { // 获取当前分组的最小房价 const minPriceA = Math.min(...valA.results.map(item => item.rooms.price)); const minPriceB = Math.min(...valB.results.map(item => item.rooms.price)); return minPriceA - minPriceB; }) );
完整代码
let object = { '2573': { results: [ { "rooms": { "price": 1500 } }, { "rooms": { "price": 1700 } } ], }, '2574': { results: [ { "rooms": { "price": 1800 } }, { "rooms": { "price": 1900 } } ], }, '2575': { results: [ { "rooms": { "price": 1850 } }, { "rooms": { "price": 1200 } } ], } }; // 排序内部results数组 for (const key in object) { object[key].results.sort((a, b) => a.rooms.price - b.rooms.price); } // 排序外层对象 const sortedObject = Object.fromEntries( Object.entries(object).sort(([, valA], [, valB]) => { const minPriceA = Math.min(...valA.results.map(item => item.rooms.price)); const minPriceB = Math.min(...valB.results.map(item => item.rooms.price)); return minPriceA - minPriceB; }) ); console.log(sortedObject);
执行后得到的结果与期望完全一致。
内容的提问来源于stack exchange,提问作者DlukikPython
相关产品推荐
相关产品推荐

