2014-08-29 78 views
0

给定一个代表点的阵列数组,我想要找到点之间的最小距离并返回该距离和该起点。我正在使用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

我无法想象循环相同的阵列上两次是有效的方法来解决这个问题。我试着用_.forEach和_.reduce这样的各种lodash函数来重写这个函数,但是我找不到一种方法不能在同一个数组上循环两次。有没有更快的方法来解决这个问题?

的示例输出用于上述代码是:

{ current_min: 1.222450611061632, loc: [ 1, 2 ] } 
+0

你可以发布一个输出的例子吗? – elclanrs 2014-08-29 01:31:55

+0

不知道你如何定义“效率”,而是用速度更快地手动迭代数组,而不是使用迭代器函数和所有那些。特别是当你期待6双。 – 2014-08-29 01:41:40

+0

我希望它能够采取任何长度的数组。 6只是一个例子。在相同的阵列上循环两次无法高效。 – Ptrkcon 2014-08-29 01:47:50

回答

1

您的问题是最古老的一种:如何最有效地排序基于某些功能键的值的数组。但是,您还需要记录最短距离,并且需要与每个其他值进行比较。正因为如此,你无法高效地排序,你需要遍历整个阵列array.length次。

考虑到您只需要6对积分,这看起来像是premature optimization的严重情况。

可读性很差,不幸的是lodash不提供生成笛卡尔产品的功能,然后您可以使用_.sortBy,也不提供允许您手动比较左侧和右侧并修改值的排序功能。我认为你目前的实现和lodash一样好。