Javascript JS:给定一个x、y坐标列表,查找1,1和给定最大值之间缺少的坐标

Javascript JS:给定一个x、y坐标列表,查找1,1和给定最大值之间缺少的坐标,javascript,arrays,math,coordinates,Javascript,Arrays,Math,Coordinates,假设我有: var coords = [ [2, 2], [2, 4], [3, 2], [3, 4] ]; var missing = []; 使用普通javascript,我如何检查coords中从[1,1]开始到(比方说)比coords中的最大值多1的每个缺少的x,y值([4,5]) 到目前为止,我已经想到了一些东西,但是我只能得到值[1,1],[2,1],[3,1]:我可以理解为什么我不确定从这里走到哪里 我确信有一种方法比我目前所走的路线更有效。类似

假设我有:

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

var missing = [];
使用普通javascript,我如何检查
coords
中从
[1,1]
开始到(比方说)比
coords
中的最大值多1的每个缺少的x,y值(
[4,5]

到目前为止,我已经想到了一些东西,但是我只能得到值
[1,1],[2,1],[3,1]
:我可以理解为什么我不确定从这里走到哪里


我确信有一种方法比我目前所走的路线更有效。

类似于以下的方法应该可以奏效:

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]);
    }
}
使用,我们可以非常简单地执行此操作,如上所示:

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)))
));
拉姆达仍在开发中。如果它有一个与其
并集
类似的
操作符,那么这将更简单。像这样的库将有类似的工具来简化这一过程(包括
差异


更新 我不满意这个解决方案,也不满意它在中所显示的内容,因此我对库做了一些补充,我认为这有助于现在:

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现在有
max
min
maxWith
minWith
eqProp
intersection
intersection
difference
所有谓词
,以及
任何谓词
函数。此解决方案利用了
max
eqProp
的差异,但使用了现有的
和fn
而不是
所有谓词。一个小问题能带来多大的变化,真是太神奇了

更新了JSFIDLE以使用最新的Ramda库(并删除了FN),谢谢。从那以后,我意识到我不应该把这些东西贴在图书馆馆长的头上,而应该贴在现有的分支上。抢手货
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);