JS:给定一个x,y坐标列表,可以找到介于1,1和给定最大值之间的缺失坐标

JS: Given a list of x, y coordinates find missing coordinates between 1,1 and largest given

本文关键字:坐标 最大值 之间 列表 一个 JS      更新时间:2023-09-26

假设我有:

var coords = [
    [2, 2],
    [2, 4],
    [3, 2],
    [3, 4]
];
var missing = [];

使用普通javascript,我如何检查coords中从[1, 1]开始到比coords[4, 5])中的最大值多出1的每一个丢失的x,y值。

到目前为止,我已经有了一个jsFiddle,但我只能返回值[1, 1], [2, 1], [3, 1]:http://jsfiddle.net/UWE5x/我明白为什么我不确定从这里去哪里。

我相信有一种比我现在走的路线更有效的方法。

以下内容应该有效:

var coords = [
    [2, 2],
    [2, 4],
    [3, 2],
    [3, 4]
];
var max_x = -1, max_y = -1, x, y;
var missing = [];
coords_obj = {};
for (var i = 0; i < coords.length; i++) {
    x = coords[i][0];
    y = coords[i][1];
    if (x > max_x) max_x = x;
    if (y > max_y) max_y = y;
    if (!coords_obj[x])
        coords_obj[x] = {};
    coords_obj[x][y] = 1;
}
for (x = 1; x <= max_x + 1; x++) {
    for (y = 1; y <= max_y + 1; y++) {
        if (!coords_obj[x] || !coords_obj[x][y])
            missing.push([x, y]);
    }
}

这导致missing出现以下情况:

[[1,1],[1,2],[1,3],[1,4],[1,5],[2,1],[2,3],[2,5],[3,1],[3,3],[3,5],[4,1],[4,2],[4,3],[4,4],[4,5]]

使用Ramda函数式编程库,我们可以非常简单地做到这一点,如JSFiddle上所示:

var missing = reject((function() {
    var makeKey = function(pair) {return pair[0] + "," + pair[1];};
    var found = map(makeKey, coords);
    return function(pair) {
        return contains(makeKey(pair), found);
    };
})(), xprod(
    range(1, 2 + Math.max.apply(null, map(get('0'), coords))),
    range(1, 2 + Math.max.apply(null, map(get('1'), coords)))
));

Ramda仍在开发中。如果它有一个类似于uniondifference运算符,这将更简单。像Undercore这样的库会有类似的工具来简化这一过程(包括difference。)


更新

我对这个解决方案不满意,也不满意它在Ramda中所缺少的东西,所以我对库进行了一些添加,我认为这会使现在有更好的代码

var pairEq = andFn(eqProps(0), eqProps(1));
var missing = differenceWith(pairEq, xprod(
    range(1, 2 + max(map(get('0'), coords))),
    range(1, 2 + max(map(get('1'), coords)))
), coords);

我知道这对OP来说可能并不重要,但它明确了我对几个功能的需求,我知道我想要这些功能,但还没有抽出时间去做,还有一个我甚至没有考虑过,但解决了这个问题(尽管我最终没有在最终版本中使用那个。)

Ramda现在具有maxminmaxWithminWitheqPropintersectionintersectionWithdifferencedifferenceWithallPredicatesanyPredicates功能。该解决方案利用了maxeqPropdifferenceWith,但使用了现有的andFn而不是allPredicates。令人惊讶的是,一个小问题能带来多大的改变!