javascript 在半径坐标的基础上过滤JSON

ppcbkaq5  于 2023-03-21  发布在  Java
关注(0)|答案(1)|浏览(112)

我需要过滤一个JSON,其中包含一个带有坐标的地点数组,以用户坐标为基础。我发现的方法是使用循环遍历数组,并在用户坐标上添加0.05,如果地点坐标在用户坐标和用户坐标+ 0.05之间,则返回该地点。
我不知道这是不是最好的方法,但它对我很有效。在这里我留下一个例子。

const filterTotems = (userCoordinates) => {
    const filtredTot = [];
    totems.map((tot) => {
      if (
        (inRange(tot.latitude, userCoordinates.latitude, userCoordinates.latitude + 0.15) &&
          inRange(tot.longitude, userCoordinates.longitude, userCoordinates.longitude + 0.15)) ||
        (inRange(tot.latitude, userCoordinates.latitude, userCoordinates.latitude - 0.15) &&
          inRange(tot.longitude, userCoordinates.longitude, userCoordinates.longitude - 0.15))
      ) {
        filtredTot.push(tot);
      }
      return true;
    });
    setFiltredTotems(filtredTot);
    return true;
  };

我使用lodash的inRange函数。
我需要一个关于这件事的其他意见,如果是另一种方式来做这件事

polhcujo

polhcujo1#

JavaScript的Array.prototype.filter()更适合你要做的事情。通过返回一个布尔值,你可以控制数组中的哪些元素被保留,而不需要手动创建一个新的数组。
看起来你的代码中可能有一个bug,你只搜索了用户坐标周围四个象限中的两个。使用lodash来做这个可能有点过头了,我们可以在vanilla JS中做到这一点。所有上述内容结合起来得到以下结果:

const filterTotems = (userCoordinates) => {
  const filteredTotems = totems.filter((tot) => {
    const latOffset = Math.abs(tot.latitude - userCoordinates.latitude);
    const lonOffset = Math.abs(tot.longitude - userCoordinates.longitude);
    return (latOffset < 0.15) && (lonOffset < 0.15);
  });

  setFiltredTotems(filteredTotems);
  return true;
};

相关问题