给定一个表示点的数组数组,我想找到点之间的最小距离并返回该距离和起点。我正在使用 lodash,并且希望尽可能实用。
我有一个数组数组:
var all = [[1,2], [3,4], [4,5]];
我还有一个具有当前最小距离和当前数组的对象:
var cur_min = {'current_min': 10, 'point': [9,10]};
我想找到数组中所有点之间的最小距离,如果该距离小于 cur_min 变量中的 current_min ,它将被更新。我提出了以下建议:
function find_new_min(current, arr) {
return _.transform(arr, function(result, a) {
_.forEach(arr, function(b) {
if (!_.isEqual(a,b)) {
var d = get_distance(a,b);
if (d<result.current_min) {
result.current_min = d;
result.point = a;
}
}
});
}, _.clone(current));
}
我期待 6 对不同的数组,因为点与其自身之间的距离为 0。
我无法想象对同一个数组进行两次循环是解决此问题的有效方法。我尝试使用各种 lodash 函数(例如 _.forEach 和 _.reduce)重写此函数,但我找不到一种不对同一数组循环两次的方法。有没有更快的方法来解决这个问题?
上述代码的示例输出是:
{ current_min: 1.222450611061632, loc: [ 1, 2 ] }
最佳答案
您的问题是最古老的问题之一:如何根据某些功能键最有效地对值数组进行排序。但是,您还想记录最短距离,为此您需要与每个其他值进行比较。因此,您无法有效排序,您需要对整个数组运行 array.length
次。
考虑到您只期望六对点,这似乎是 premature optimization 的严重情况。 .
就可读性而言,不幸的是,lodash 不提供生成笛卡尔积的功能,您可以使用 _.sortBy
生成笛卡尔积,也不提供排序功能,允许您手动进行左右比较并修改数值。我认为您当前的实现与 lodash 的实现一样好。
关于javascript - 对每个数组成员进行计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25560410/