说我有:
var coords = [
[2, 2],
[2, 4],
[3, 2],
[3, 4]
];
var missing = [];
使用vanilla javascript,我如何检查coords
每个缺失的x,y值,从[1, 1]
开始,结束于比coords
中的最大值1更多({ {1}})。
我有一个jsFiddle,我到目前为止所得到的但是我只能找回[4, 5]
的值:http://jsfiddle.net/UWE5x/我可以看到为什么我不知道从哪里去这里。
我确信这比我目前的路线更有效。
答案 0 :(得分:0)
以下内容应该有效:
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]]
答案 1 :(得分:0)
使用 Ramda functional programming library ,我们可以相当简单地执行此操作,如 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仍处于开发阶段。如果它的difference
运算符类似于union
运算符,那么这将更简单。像 Underscore 这样的库可以使用类似的工具来简化(包括difference
。)
我对这个解决方案感到不满意,并且从 Ramda 中显示的内容不足,所以我对该库进行了一些补充,我认为这样可以实现 nicer code 现在:
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
,intersectionWith
,{{ 1}},difference
,differenceWith
和allPredicates
个函数。此解决方案利用anyPredicates
,max
,eqProp
,但使用现有的differenceWith
代替andFn
。令人惊讶的是,一个小小问题可以带来多少变化!