【问题标题】:How to create a method to validate the range of an Array?如何创建一种方法来验证数组的范围?
【发布时间】:2015-04-07 13:25:41
【问题描述】:

我有一个具有一些属性的对象。我想创建一个方法,如果数组的位置在范围内,则返回,但我不知道如何创建它。 (我正在尝试在 AngularJS 中制作扫雷,所以这段代码在 .factory 中)

我的代码如下:

var tableSquare = function(num_rows, num_bombs){
        this.numRows = num_rows;
        this.numBombs = num_bombs;
        this.positions = new Array(numRows);
        for (i = 0; i < numRows; i++) {
            this.positions[i] = new Array(numRows);
        }
};

现在我有一个工作函数 inRange(值必须是 >=0 并且

var inRange = function(i,j, range){
    if (i>=0 && i<= range-1 && j>=0 && j<=range-1)
        return true;
    return false;
};

所以我可以查看我的数组的元素是否在范围内,我像这样使用它(numBombs 它是我在每个 tableSquare.positions 中插入的对象的属性):

if (inRange(i-1,j-1,this.numRows)) this.positions[i-1][j-1].numBombs += 1; //up left

我想要这样的方法:

tableSquare.prototype.inRange = function(){
    //I don't know how to read here i and j
    //in this.positions[i][j]
};

所以我可以使用这个函数制作:

if (this.positions[i-1][j-1].inRange()) this.positions[i-1][j-1].numBombs += 1;

如何创建这个 inRange 方法?谢谢;)

【问题讨论】:

  • 您是否在这里过度使用了 OO?这个 tableSquare 需要做什么?您现有的 inRange 函数不是已经很好地检查了边界吗?
  • 嗨 Adrian,inRange 工作正常,我正在尝试学习 AngularJS 和 OO Javascript。这就是为什么我想知道该怎么做。我正在学习创建这个扫雷器
  • 但是即使你创建了一个 tableSquare 类,它的 inRange 函数也是多余的,因为如果你找到了一个 tableSquare 对象来敲击,那么显然你在范围内。
  • 是的,但现在我使用 inRange 函数来获取拥有炸弹的人周围的所有方格。如果炸弹位于 [0][0] 位置,则上方或左侧没有正方形,因此我必须在访问其属性之前知道它们是否存在。现在我在 angular.factory 中使用 inRange,但我也需要验证控制器中的范围,所以如果它是类的方法,我不需要在控制器中复制 inRange 函数。在控制器中,当单击一个正方形时,我必须再次读取单击一个正方形周围的所有正方形。
  • 您提出了一个不带参数的 inRange 方法。那只能说“this”是否在范围内,当然它是否存在。 getNeighbours() 方法怎么样?无论如何,您是认真地说角度不会让您调用全局函数吗?它会怎样阻止你?

标签: javascript arrays angularjs object methods


【解决方案1】:

你的 tableSquare 应该是

 var tableSquare = function(num_rows, num_bombs){
    this.numRows = num_rows;
    this.numBombs = num_bombs;
    this.positions = new Array(this.numRows);

    for (var i = 0; i < this.numRows; i++) {
        this.positions[i] = new Array(this.numRows);
    }
    this.inRange = function(i,j, range){
      if (i>=0 && i<= range-1 && j>=0 && j<=range-1)
         return true;
      return false;
    };
};

然后你应该创建一个 tableSquare 的对象来做你的操作。

 var objectOne= new tableSquare(4,4)

你可以如下调用inRange()

objectOne.inRange(1,2,3)

在这里学习javascript:

1)http://eloquentjavascript.net/

2.) https://stackoverflow.com/tags/javascript/info

【讨论】:

  • 谢谢尼丁。我想在位置上使用 inRange。您的解决方案与我的函数相似,但从对象调用。
  • 您可以将位置传递给 inRange,inRange 现在正在接受参数
  • (抱歉耽搁了,我没有收到电子邮件回复通知)
【解决方案2】:

感谢所有 cmets。我想要的是这样的:

object.positions[1][4].inRange()

这个 inRange 函数应该读取 1 和 4 以及位置和 position[0] 的长度,并验证它们是否在 de 数组中。我不知道如何阅读这个索引(我确实做到了,但是将此坐标添加到 positios 内的 objetc 中,因此会复制信息)。

所以我使用 Adeian May 的解决方案“getNeighbours()”如下:

var tableSquare = function(num_rows, num_bombs){
    this.numRows = num_rows;
    this.numBombs = num_bombs;

    this.positions = new Array(num_rows);
    for (var i = 0; i < num_rows; i++)
        this.positions[i] = new Array(num_rows);

    this.findingNeighbors = function (i, j) {
        var rowLimit = this.positions.length-1;
        var columnLimit = this.positions[0].length-1;
        var neighbors = [];

        for(var x = Math.max(0, i-1); x <= Math.min(i+1, rowLimit); x++)
            for(var y = Math.max(0, j-1); y <= Math.min(j+1, columnLimit); y++)
                if(x !== i || y !== j)
                    neighbors.push([x,y]);

        return neighbors;
    };
};

并按如下方式调用它,所以我只与邻居合作,不必验证它们是否在范围内:

 neighbors = this.findingNeighbors(i,j).slice();
 for (x = 0; x < neighbors.length; x++)
    this.positions[neighbors[x][0]][neighbors[x][1]].numBombs +=1;

这可以工作,但仍然不知道是否可以在不传递参数的情况下读取数组中的索引,例如:

(seudocode)
table.positions.inRange = function(){
    var position x = read first index of the array (positions[x])
    var position y = read second index of the array (positions[y])
    lenght-x = positions.length
    and so on...

然后使用 xxxxx.positions[1][4].inRange() 我可以读取这个“1”索引和“4”索引。 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多