javascript - 对每个数组成员进行计算

标签 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 ] }

最佳答案

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

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

就可读性而言,不幸的是,lodash 不提供生成笛卡尔积的功能,您可以使用 _.sortBy 生成笛卡尔积,也不提供排序功能,允许您手动进行左右比较并修改数值。我认为您当前的实现与 lodash 的实现一样好。

关于javascript - 对每个数组成员进行计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25560410/

相关文章:

arrays - 过滤 Swift 数组并给出索引(不是值)

javascript - 将公共(public)对象追加到一个数组中并删除重复项

Javascript更新并忽略目标中的未定义字段

javascript - 网页上的语法高亮 Markdown

java - xor如何在两个数组中给出不同的数字‽

javascript - D3 - 在 svg 中将滚动应用到图例容器时出现问题

scala - 具有依赖类型的工厂方法

javascript - Node.js/Mongoose/lodash - 服务器响应 : User Validation Failed: path `foo` is required

javascript - 为什么我的某些选项卡会导致我的内容稍微向右移动?

javascript - ES6 导入和 node_modules hell