For 循环后返回排序数组

时间:2021-01-20 00:52:14

标签: javascript arrays sorting for-loop return

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

我很难从 for 循环中获取排序数组作为回报。在完美的世界中,新数组将与索引 [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,
            }
          );
        }
      });
  }

2 个答案:

答案 0 :(得分:1)

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

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

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

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

让我知道这是否适合您!

答案 1 :(得分:1)

在 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
})