我有一系列位置,想要找到与第一个位置不同的第一个位置(或一组位置)。 “不同”是指基于确定距离的函数的明显不同的位置。这是一个示例数组:
[
{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范围内。
我目前的解决方案是:
slice
该位置索引中的数组splice
数组将删除剩余的这是一个草率的实现:
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
}
这需要通过位置进行多次循环,并且难以遵循。有没有办法通过减少时间复杂度和/或使其更容易理解来简化这一点?
答案 0 :(得分:0)
具有两个循环的解决方案简单,直接且高效。我没有理由改变这一点。但是,您不应该经常slice
和splice
任何数组,只需在初始数组中找到匹配的第一个和最后一个索引 - 然后{{1}最后一次。
此外,您的代码可以简化:
slice