You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 13:42:48