【问题标题】:Return Sorted Array after For LoopFor循环后返回排序数组
【发布时间】:2021-04-24 08:27:33
【问题描述】:

我试图通过使用npm geolib 来获取纬度|经度坐标之间的距离。我有一个函数,可以在其中查询 firestore 并返回一组对象。然后我通过一个 for 循环运行该数组,在该循环中我调用 geolib.getPreciseDistance 以获取数组中每个对象的距离。

我很难从 for 循环中获得一个排序数组作为返回。在理想情况下,新数组将使用 index[0] 中距离最近的对象进行排序。

我已经在下面发布了。我感谢任何和所有反馈,因为我仍在学习。谢谢!

  function getNearestWalk() {
    let currentLng = userLocation.longitude;
    let currentLat = userLocation.latitude;
    firestore()
      .collection('Walks')
      .where('status', '==', 'started')
      .limit(10)
      .get()
      .then((walks) => {
        const walksArray = [];
        walks.forEach((liveWalks) => {
          walksArray.push(liveWalks.data());
        });
        console.log(walksArray);

        for (var i = 0; i < walksArray.length; i++) {
          geolib.getPreciseDistance(
            { latitude: currentLat, longitude: currentLng },
            {
              latitude: walksArray[i].latitude,
              longitude: walksArray[i].longitude,
            }
          );
        }
      });
  }

【问题讨论】:

  • 您要对 walsArray 进行排序,还是在 for 循环之后还有另一个要排序的数组或对象?如果在循环之后向我们提供您从循环中获得的数据
  • @Elnatanvazana 感谢您的快速回复。我希望 for 循环返回一个按循环中执行的操作排序的新数组。该循环正在获取恒定位置与数组中每个对象的位置之间的距离。我试图在第一个索引位置获得一个具有最短距离的对象的新数组。我希望这是有道理的。再次感谢!
  • 你能分享一个你从geolib.getPreciseDistance()收到的对象吗,请编辑你的问题并添加它,你可以做console.log(geolib.getPreciseDistance({//put parameters here},{//put parameter here}))

标签: javascript arrays sorting for-loop return


【解决方案1】:

根据我在您对@Elnatan 的回复中收集到的信息,听起来您想要一个表示按最短...最远距离排序的坐标的对象数组

最直接的方法(不考虑复杂性)如下:

  • 创建一个辅助函数distCalc,它接受一个对象来执行调用geolib.getPreciseDistance 的循环逻辑并返回其值。
  • 然后您可以设置一个变量,指向评估:
    walksArray.sort( (a, b) =&gt; distCalc(a) - distCalc(b) )
  • 返回排序后的数组。

就个人而言,我会在您的#getNearestWalk 中分离关注点以获得最佳实践,并创建一个辅助函数来获取您的步行,以便使用try {} catch {} 实现有效的错误处理,因为异步调用无法保证。

让我知道这是否适合你!

【讨论】:

  • 谢谢@DanderMensch!代码库中似乎已经有一个辅助函数,所以非常感谢!
【解决方案2】:

在 OP 代码中,walks 是一个查询快照。首先要做的是提取文档数据。此函数执行查询并获取文档数据...

function getStartedWalks() {
  return firestore()
      .collection('Walks')
      .where('status', '==', 'started')
      .limit(10)
      .get()
      .then(querySnapshot => querySnapshot.docs.map(d => d.data()));
}

此函数将给定点的距离分配到文档数据中...

// to each doc in docs, assign the distance from a given position
function assignDistances(docs, position) {
  return docs.map(doc => {
    const docPosition = { latitude: doc.latitude, longitude: doc.longitude };
    const distance = geolib.getPreciseDistance(position, docPosition);
    return { ...doc, distance }
  })
}

现在 getNearestWalk() 很容易编写...

function getNearestWalk(position) {
  return getStartedWalks().then(docs => {
    docs = assignDistances(docs, position)
    return docs.sort((a, b) => a.distance - b.distance)
  });
}

这样称呼...

getNearestWalk(userLocation.latitude, userLocation.longitude).then(array => {
  // array will be the doc data, sorted by distance from userLocation
})

【讨论】:

  • 谢谢!我也尝试了您的解决方案,它按预期工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-24
  • 2015-01-25
  • 2022-12-12
  • 2015-08-08
  • 2018-09-07
  • 2019-04-24
  • 2021-08-14
相关资源
最近更新 更多