本文详解如何将房间基础信息数组与房态可用性数组按 `roomcode`/`room` 字段精准关联,生成嵌套多维结构,解决因字段名不一致导致的空匹配问题,并提供可直接用于 express api 的健壮实现方案。
在构建酒店或度假村类 API 时,常需将静态房间元数据(如房型、面积、图片路径)与动态房态数据(如每日可订数量、积分价格)进行结构化聚合。你当前遇到的核心问题是:room_availability 数组中用于匹配的字段名为 room,而非 roomcode——而你在 .filter() 中错误地使用了 f.roomcode == item.roomcode,导致所有 dates 子数组为空。
观察数据结构可知:
因此,只需修正过滤条件中的键名:
app.get("/resort-info/room-availability/start/:start/end/:end", async (req, res) => {
try {
const rooms = await getRooms();
const start = req.params.start;
const end = req.params.end;
const room_availability = await getRoomAvailability(start, end);
// ✅
关键修复:使用 f.room(而非 f.roomcode)匹配 item.roomcode
const combined = rooms.map(room => ({
...room,
dates: room_availability.filter(availability =>
availability.room === room.roomcode
)
}));
res.json(combined); // 推荐使用 .json() 而非 .send(),自动设置 Content-Type
} catch (error) {
console.error("Room-availability merge failed:", error);
res.status(500).json({ error: "Failed to merge room data" });
}
});若 room_availability 数据量较大(如数百个房型 × 数百天),多次 filter() 会带来 O(n×m) 时间复杂度。推荐预先构建以 room 为键的 Map:
const availabilityMap = new Map();
room_availability.forEach(item => {
const key = item.room;
if (!availabilityMap.has(key)) {
availabilityMap.set(key, []);
}
availabilityMap.get(key).push(item);
});
const combined = rooms.map(room => ({
...room,
dates: availabilityMap.get(room.roomcode) || [] // 安全回退空数组
}));该问题本质是对象属性名认知偏差——开发中务必仔细比对源数据字段命名。一次 f.roomcode → f.room 的修正,即可让嵌套结构正确生成。结合 Map 预处理与错误防护,你的 /room-availability 接口将兼具正确性、性能与稳定性,为前端提供开箱即用的多维房间数据视图。