计算每个阵列成员

时间:2014-08-29 01:30:50

标签: javascript functional-programming lodash

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

1 个答案:

答案 0 :(得分:1)

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

考虑到你只期望六对点,这似乎是premature optimization的严重情况。

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