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组合如何定义一个块?你的三个坐标的逻辑是什么?我不知道关于数组!你,我的朋友,是个天才!