Javascript查找邻接
我有一个名为Javascript查找邻接,javascript,Javascript,我有一个名为Block的“类”。它拥有三个变量:x、y和z,这三个变量分别是它的三维坐标。我很难找到一个街区的“邻居”数量。也就是说,如果此与其他共享一个面、边或顶点,则应返回true。因此,block.neights()返回block的邻居数。但是,它返回的是0,而不是预期的1。我的代码如下所示: var blocks = []; function Block(x, y, z) { blocks.push(this); this.x = x; this.y = y
Block
的“类”。它拥有三个变量:x
、y
和z
,这三个变量分别是它的三维坐标。我很难找到一个街区的“邻居”数量。也就是说,如果此
与其他
共享一个面、边或顶点,则应返回true。因此,block.neights()
返回block
的邻居数。但是,它返回的是0
,而不是预期的1
。我的代码如下所示:
var blocks = [];
function Block(x, y, z) {
blocks.push(this);
this.x = x;
this.y = y;
this.z = z;
this.neighbours = function() {
var n = 0;
for (var block in blocks) {
if (block == this) {
continue;
}
if (Math.abs(block.x - this.x) <= 1 && Math.abs(block.y - this.y) <= 1 && Math.abs(block.z - this.z) <= 1) {
n++;
}
}
return n;
};
}
var b1 = new Block(0, 0, 0);
var b2 = new Block(0, 1, 0);
document.getElementById("box").innerHTML = b1.neighbours();
var块=[];
功能块(x、y、z){
推(这个);
这个.x=x;
这个。y=y;
这个。z=z;
this.neights=函数(){
var n=0;
for(块中的var块){
if(block==this){
持续
}
如果(Math.abs(block.x-this.x)代码中的错误是(for(var block in blocks){
没有像您预期的那样迭代--var block in blocks
迭代0
和1
的属性名,如下所示:
您可以通过执行以下操作来修复它:
for (var blockKey in blocks) {
var block = blocks[blockKey];
JSFiddle:
另一种解决方法是这样写:
var blocks = [];
function Block(x, y, z) {
blocks.push(this);
this.x = x;
this.y = y;
this.z = z;
this.neighbours = function() {
var n = 0;
blocks.forEach(function(block) {
if (block != this && Math.abs(block.x - this.x) <= 1 && Math.abs(block.y - this.y) <= 1 && Math.abs(block.z - this.z) <= 1) {
n++;
}
}, this);
return n;
};
}
var b1 = new Block(0, 0, 0);
var b2 = new Block(0, 1, 0);
document.getElementById("box").innerHTML = b1.neighbours();
var块=[];
功能块(x、y、z){
推(这个);
这个.x=x;
这个。y=y;
这个。z=z;
this.neights=函数(){
var n=0;
blocks.forEach(函数(block){
如果(block!=this&&Math.abs(block.x-this.x)in
语句中的for…返回键,而不是映射/数组的实际值。您必须在每次迭代中查找块,例如
var key, block;
for (key in blocks) {
block = blocks[key]
/* ... */
}
但是,如果您这样做,它将获取属性名称,而不是值。您必须执行以下操作:
for (var index in blocks) {
var block = blocks[index];
在现有代码中,block
是0
第一次迭代,而1
是第二次迭代
但是,您应该使用以下选项:
for(var i = 0; i < blocks.length; i++){
var block = blocks[i];
for(变量i=0;i
你能再检查一遍你的代码吗?好像n++从来没有运行过……我知道。事实上,这就是问题所在!而且如果(block==this)
不起作用。@Nathan:只要所有条目都有唯一的坐标就足够了。你所说的“block”似乎只是一个点。一个x,y,z组合如何定义一个块?你的三个坐标的逻辑是什么?我不知道关于数组!你,我的朋友,是个天才!