如何将API返回的日历数据更新至对应Listings对象并合并同ID数据?
嘿,我来帮你搞定这两个问题,思路其实挺清晰的,咱们一步步来:
问题1:仅更新API返回的对应Listings条目
要高效定位到需要更新的条目,最省事的办法是先给原listings数组创建一个ID映射对象——用每个listing的id作为键,对应的值就是该listing对象本身。这样后续查找对应条目时,时间复杂度是O(1),比每次遍历整个数组高效多了。
问题2:合并同一listingId的日期价格数据到calendar数组
结合上面的ID映射,我们可以遍历API返回的所有日期数据,找到对应的listing后,把日期、价格、状态这些字段提取出来,添加到它的calendar数组里。注意原数据里的calendar是字符串格式的数组(比如"[]"),所以需要先转成真正的JS数组,操作完再转回去保持格式一致。
完整实现代码(JavaScript)
// 你的原始Listings对象 const originalListings = { "listings": [ { "id": "5e0f9c42e84d27001f63f725", "property": "ithaca", "unit": "superior-king", "calendar": "[]" }, { "id": "5e0f9c43e84d27001f63f93b", "property": "ithaca", "unit": "superior-king", "calendar": "[]" }, { "id": "5e0fadd0ff2ba100208700d0", "property": "ithaca", "unit": "classic-king", "calendar": "[]" }, // ... 其他条目省略 ] }; // API返回的日期数据示例(修正了语法错误) const apiResponse = [ { data: {date: "2020-04-29", listingId: "5e0f9c42e84d27001f63f725", status: "available", price: 95} }, { data: {date: "2020-04-30", listingId: "5e0f9c42e84d27001f63f725", status: "available", price: 96} }, { data: {date: "2020-05-01", listingId: "5e0f9c42e84d27001f63f725", status: "available", price: 99} }, { data: {date: "2020-04-29", listingId: "5e0f9c43e84d27001f63f93b", status: "available", price: 98} }, { data: {date: "2020-04-30", listingId: "5e0f9c43e84d27001f63f93b", status: "available", price: 99} }, { data: {date: "2020-05-01", listingId: "5e0f9c43e84d27001f63f93b", status: "available", price: 100} } ]; // 步骤1:创建listing的ID映射,方便快速查找,同时转换calendar格式 const listingMap = originalListings.listings.reduce((map, listing) => { map[listing.id] = listing; // 把字符串格式的calendar转成数组,方便后续操作 listing.calendar = JSON.parse(listing.calendar); return map; }, {}); // 步骤2:遍历API返回的数据,合并到对应的listing的calendar中 apiResponse.forEach(item => { const { listingId, date, price, status } = item.data; const targetListing = listingMap[listingId]; if (targetListing) { // 将日期数据添加到calendar数组 targetListing.calendar.push({ date, price, status }); } }); // 步骤3(可选):如果需要保持原格式,把calendar转回字符串 originalListings.listings.forEach(listing => { listing.calendar = JSON.stringify(listing.calendar); }); // 现在originalListings就是更新后的对象了 console.log(originalListings);
关键细节说明
- ID映射的作用:避免每次查找都遍历整个
listings数组,尤其是当listings数量很多时,能大幅提升性能。 - calendar格式转换:原数据中
calendar是字符串,必须用JSON.parse转成数组才能添加元素;如果后续需要保持原格式,再用JSON.stringify转回去。 - 容错处理:代码里加了
if (targetListing)的判断,防止API返回的listingId在原listings中不存在的情况,避免报错。
内容的提问来源于stack exchange,提问作者Dan Martin
相关产品推荐
相关产品推荐

