JS:给定一个x,y坐标列表,可以找到介于1,1和给定最大值之间的缺失坐标
JS: Given a list of x, y coordinates find missing coordinates between 1,1 and largest given
假设我有:
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仍在开发中。如果它有一个类似于union
的difference
运算符,这将更简单。像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现在具有max
、min
、maxWith
、minWith
、eqProp
、intersection
、intersectionWith
、difference
、differenceWith
、allPredicates
和anyPredicates
功能。该解决方案利用了max
、eqProp
、differenceWith
,但使用了现有的andFn
而不是allPredicates
。令人惊讶的是,一个小问题能带来多大的改变!
- 在Javascript数组中查找绝对最大值
- Html5输入属性的默认值,如最小值、最大值、大小等
- 按最大值获取数组索引
- 识别滑块范围的最小值和最大值
- 如何在最大值之前的某个点停止范围滑块
- 访问Highcharts系列的最小/最大值:afterSetExtremes不会激发
- 如何在拖动后获得图表的最小值和最大值放大高图表
- AngularJs:在数字输入字段中设置验证的条件最小值和最大值
- HTML5范围滑块最小值和最大值
- 如何仅在存在最小值和最大值时才显示错误消息
- 在 JavaScript 事件中添加最小值和最大值
- 从 JavaScript 中的数组中获取最大值和最小值
- 获取整数对象属性名称的最小值和最大值
- 高图表 - 在缩放重置中设置最大值和最小值
- Java 脚本 设置日期的最小值和最大值属性
- 使用javascript动态更改select中的最大值
- 如何设置jQuery微调器的最大值和最小值
- 当达到最小值和最大值时,防止在输入中显示额外的文本
- 使用函数从数组中查找最小值和最大值
- JS:给定一个x,y坐标列表,可以找到介于1,1和给定最大值之间的缺失坐标