使用异步函数转换深度嵌套(动态)数据

问题描述 投票:0回答:1

我有一个看起来像这样的对象:

{
  name: 'Appropriate Trip Name',
  mood: 'Provided trip mood',
  itinerary: [
    {
      destination: 'Destination 1',
      num_days: 2,
      recommendations: {
        day_1: [
          {
            name: 'Day 1, Suggestion 1',
            justification: 'Justification 1',
            official_name: 'Official Name 1',
          },
          {
            name: 'Day 1, Suggestion 2',
            justification: 'Justification 2',
            official_name: 'Official Name 2',
          },
        ],
        day_2: [
          {
            name: 'Day 2, Suggestion 1',
            justification: 'Justification 1',
            official_name: 'Official Name 1',
          },
          {
            name: 'Day 2, Suggestion 2',
            justification: 'Justification 2',
            official_name: 'Official Name 2',
          },
        ],
      },
    },
    {
      destination: 'Destination 2',
      num_days: 1,
      recommendations: {
        day_1: [
          {
            name: 'Day 1, Suggestion 1',
            justification: 'Justification 1',
            official_name: 'Official Name 1',
          },
        ],
      },
    },
  ],
}

这只是一个示例 - 真实对象可以在行程数组中包含 x 目的地对象,在每个推荐数组中包含 y 天,以及在每天数组中包含 z 推荐。

我需要访问每个推荐对象...

{
  name: 'Day 1, Suggestion 1',
  justification: 'Justification 1',
  official_name: 'Official Name 1',
}

...并用附加属性来丰富它。我有一个函数接受推荐对象并返回丰富的对象,但该过程是异步的,因为它从多个 API 端点获取这些新属性的数据。

我可以在循环中执行几个循环并获取每个推荐对象,但无论我尝试什么可能的

async/await
Promise.all()
Promise.resolve()
组合,生成的行程数组最终都会出现嵌套的未解决的承诺。

总的来说,我希望您对实现我上面描述的这个对象的转换的最佳方法有一些好的建议。谢谢!

javascript async-await promise nested-loops
1个回答
0
投票

在尝试发布我之前最接近目标的内容时,并为了回应有关分享我所尝试的原始问题的评论,我想出了这个(有效!):

for (let destination of itinerary) {
  for (let day in destination.recommendations) {
    for (let recommendation of destination.recommendations[day]) {
      itinerary[itinerary.indexOf(destination)].recommendations[day][destination.recommendations[day].indexOf(recommendation)] = await enrichRecommendation(recommendation);
    }
  }
}

原来的行程按照预期的方式成功地丰富了,但这些却非常难以理解,而且一团糟。我试图结合 .forEach() 和 .map() 来做到这一点,但我搞砸了数据结构。我将不胜感激任何有关如何以更优雅的方式完成此任务的建议!

© www.soinside.com 2019 - 2024. All rights reserved.