【问题标题】:How to properly map data?如何正确映射数据?
【发布时间】:2021-08-19 13:33:13
【问题描述】:

我正在开发一个日历应用程序,它有一个来自“react-native-calendars”的议程。要显示日期,它需要以下内容:

items={{'2012-05-22': [{name: 'item 1 - any js object'}], ...}}

在我的 Firebase 后端中,我存储了约会的开始和结束日期以及一个数组,其中包括它的每一天(因此,如果约会从昨天开始到明天结束,则数组将昨天、今天和明天存储为日期。数组中的日期数量不同!)

api数据结构如下:

apiData = [
          {data: {allDays: ["2021-08-18", "2021-08-19", "2021-08-20"],
                  start: "2021-08-18",
                  end: "2021-08-20"
                  },
           id: "string"},
          {data: {allDays: ["2021-08-20", "2021-08-21", "2021-08-22", "2021-08-23"],
                  start: "2021-08-20",
                  end: "2021-08-23"
                  },
           id: "string"},
           //more Data
           ]

我得到以下代码来映射文档:

let markedDayAll = {};

{apiData.map(({data: {start, end, allDays}}) => (
    markedDayAll[alldays] = [{
      start: start,
      end: end
    }]
  ))};

它以正确的“items”格式输出,但现在,显然是这样显示的:

items={{
   '2021-08-18, 2021-08-19, 2021-08-20': [{start: "2021-08-18, end: "2021-08-20}]
   }}

但我需要以下内容:

items={{
   '2021-08-18': [{start: "2021-08-18, end: "2021-08-20}],
   '2021-08-19': [{start: "2021-08-18, end: "2021-08-20}],
   '2021-08-20': [{start: "2021-08-18, end: "2021-08-20}]
   }}

如何正确映射数据,从而获得所需的结果?

【问题讨论】:

  • 您能否编辑您的问题以显示apiData 的值(作为文本,请不要截图)?
  • 我更新了问题。提前谢谢!

标签: javascript firebase react-native react-native-calendars


【解决方案1】:

您可以使用array#reduce 遍历每个对象,然后遍历allDays 中的每个日期并生成您的对象。

const apiData = [ {data: {allDays: ["2021-08-18", "2021-08-19", "2021-08-20"], start: "2021-08-18", end: "2021-08-20" }, id: "string"}, {data: {allDays: ["2021-08-20", "2021-08-21", "2021-08-22", "2021-08-23"], start: "2021-08-20", end: "2021-08-23" }, id:"string"} ],
      result = apiData.reduce((r, {data}) => {
        data.allDays.forEach(date => {
          r[date] ??= [];
          r[date].push({start: data.start, end: data.end});
        });
        return r;
      },{});
console.log(result);

【讨论】:

  • 这几乎可以正常工作!我现在绊倒的是它不处理重叠的日期。在此示例中,两个示例 apiData 对象都使用了“2021-08-20”。另外我刚刚检查过,“议程”中的“项目”只接受这个:'2021-08-20': [{"start": "2021-08-18", "end": "2021-08-20"}, {"start": "2021-08-18", "end": "2021-08-20"}] 而不是"2021-08-20": [{"start": "2021-08-18", "end": "2021-08-20"}, "2021-08-20": [{"start": "2021-08-20", "end": "2021-08-23"}。有没有办法修改你的答案?非常感谢!
  • 更新代码将推送新的开始和结束日期,用于重复键。
  • 您先生,是一个优秀的人!非常感谢您!
猜你喜欢
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
  • 2016-07-16
  • 1970-01-01
相关资源
最近更新 更多