在数组

时间:2017-10-10 11:43:18

标签: javascript arrays

我有一系列位置,想要找到与第一个位置不同的第一个位置(或一组位置)。 “不同”是指基于确定距离的函数的明显不同的位置。这是一个示例数组:

[
  {lat: 45, lng: 45},           // 1st Location
  {lat: 45.01, lng: 45.01},     // 1st Location
  {lat: 55, lng: 55},           // 2nd Location - MATCH
  {lat: 55.01, lng: 55.01},     // 2nd Location - MATCH
  {lat: 54.99, lng: 54.99},     // 2nd Location - MATCH
  {lat: 55, lng: 55},           // 2nd Location - MATCH
  {lat: 65, lng: 65},           // 3rd Location
  {lat: 65.01, lng: 65.01}      // 3rd Location
]

在上面的示例中,结果应该是仅包含第二个位置的数组。假设位置匹配,如果它们在0.2 lat / lng范围内。

我目前的解决方案是:

  1. 获取第一个项目的位置
  2. 循环通过其余位置,如果位置与第一个位置不同,slice该位置索引中的数组
  3. 循环通过剩余的位置,如果位置与第一个位置不同,splice数组将删除剩余的
  4. 这是一个草率的实现:

    var locations = [
      {lat: 45, lng: 45},
      {lat: 45.01, lng: 45.01},
      {lat: 55, lng: 55},
      {lat: 55.01, lng: 55.01},
      {lat: 54.99, lng: 54.99},
      {lat: 55, lng: 55},
      {lat: 65, lng: 65},
      {lat: 65.01, lng: 65.01}
    ];
    
    const startingLocation = locations.splice(0,1)[0];
    
    const first = locations.findIndex(location => {
      const { lat, lng } = location;
      return newLocation(startingLocation.lat, startingLocation.lng, lat, lng);
    });
    
    const validLocations = locations.slice(first);
    
    const newLatLng = validLocations[0];
    
    const last = validLocations.findIndex(location => {
      const { lat, lng } = location;
      return newLocation(newLatLng.lat, newLatLng.lng, lat, lng);
    });
    
    if (last > -1) {
      validLocations.splice(last);
    }
    
    console.log(validLocations)
    
    // Helper function to test if locations are the same
    // For demo purposes only
    function newLocation(lat1, lng1, lat2, lng2) {
       return Math.abs(lat1 - lat2) + Math.abs(lng1 - lng2) > 1
    }

    这需要通过位置进行多次循环,并且难以遵循。有没有办法通过减少时间复杂度和/或使其更容易理解来简化这一点?

1 个答案:

答案 0 :(得分:0)

具有两个循环的解决方案简单,直接且高效。我没有理由改变这一点。但是,您不应该经常slicesplice任何数组,只需在初始数组中找到匹配的第一个和最后一个索引 - 然后{{1}最后一次。

此外,您的代码可以简化:

slice