好的,所以我有一个这样的清单:
https://haxified.is-a-me.me/0a94f61d.png
我希望找到最接近的三个,所以例如我跑了
1539, 4502
它会找到三个最接近的值,最接近我的意思是最相似的字符串的第一个和第二个值(用逗号分隔)
我试过做一个for循环,并计算出所有这些之间的距离,但它没有用。
答案 0 :(得分:1)
您的数据格式不佳。您需要一组数字数组,而不是字符串数组。所以第一项任务就是进行转换。
然后你可以使用距离公式计算到给定坐标的距离,并将其存储为列表中每个点的额外信息。
然后按该额外距离排序。对它进行排序不是最有效的方法,因为您可以先检索最小距离,然后在删除第一个之后检索最小值,最后在删除找到的第一个最小值后再次检索最小值。但如果您对此类优化感兴趣,请亲自试试。
排序后,将前三个元素切割出结果数组并返回。您可能希望将这三个项目转换回原始格式,即三个字符串的数组。
这是一个片段:
function closestThree(data, px, py) {
return data
.map( s => s.split(',').map(Number) ) // Convert to pairs of numbers
.map( ([x,y]) => [x,y,(x-px)*(x-px)+(y-py)*(y-py)] ) // Add squared distance
.sort( (a, b) => a[2] - b[2] ) // Sort by distance
.slice(0, 3) // Get three first results
.map( ([x, y]) => x + ',' + y ); // Convert back to strings
}
// Sample
const points = ['123,5432', '432,325', '735,1045', '583,564'];
const res = closestThree(points, 405, 630);
console.log(res);