1

在 Javascript 中,我有一个具有可变行数和列数的矩阵,我希望将其存储在多维数组中。

问题是我在矩阵中还需要额外的 3 列和 3 行带有索引的额外行。所以 10x10 矩阵的结果应该是一个 13x13 数组,索引从 -3 到 9。

我用以下方式定义数组:

  var numberofcolumns = 10;
  var numberofrows = 10;
  var matrix = [];
  for (var x = -3; x < numberofcolumns; x++) {
    matrix[x] = [];
  }

这是正确的方法吗?或者,还有更好的方法?

4

3 回答 3

3

虽然您可以创建负数属性,但您会失去一些 Javascript 的伪数组魔法。特别是,matrix.length即使它有 13 个元素,它仍然是 10。总的来说,这些代码可能会让任何阅读它的人感到惊讶。

您最好定义一个偏移量以从数组索引中获取所需的值,反之亦然:

var offset = 3
for (var x=-3; x<numberofcolumns; x++) {
   matrix[x+offset] = []
}
于 2012-10-14T23:08:11.143 回答
1

我同意 Mark Reed 关于这是对 Array 的不直观使用的观点。我认为子类是有序的。您可以按照此处的教程对 Array 进行子类化,保留原生括号表示法,并覆盖 length() 等方法,以便它们提供合理的值。子类化还有一个额外的好处,那就是让那些阅读你的代码的人清楚地知道除了你的日常数组之外还有一些事情正在发生。

于 2012-10-14T23:32:15.413 回答
1

您可以将矩阵定义为对象。你会失去一些数组功能,但你仍然可以访问matrix[-3]例如。

  var numberofcolumns = 10;
  var numberofrows = 10;
  var matrix = {};
  for (var x = -3; x < numberofcolumns; x++) {
    matrix[x] = [];
  }
  for (x in matrix) {
    console.log(matrix[x]);
  }

或者,您可以将自己的类定义为对象或数组,然后从那里开始工作。这里有一些东西可以帮助你开始:

function Matrix() { };

Matrix.prototype.LBound = function()
{
    var n;
    for (i in this) {
        if (!isNaN(i) && (isNaN(n) || n > i))
            n = parseInt(i);
    }
    return n;
};

Matrix.prototype.UBound = function()
{
    var n;
    for (i in this) {
        if (!isNaN(i) && (isNaN(n) || n < i))
            n = parseInt(i);
    }
    return n;
};

Matrix.prototype.length = function()
{
    var length = this.UBound() - this.LBound();
    return isNaN(length) ? 0 : length+1;
};

Matrix.prototype.forEach = function(callback, indexes)
{
    if (!indexes) var indexes = [];
    for (var i = this.LBound(); i <= this.UBound() ; i++)
    {
        indexes[Math.max(indexes.length-1, 0)] = i;
        callback(this[i], indexes);
        if (this[i] instanceof Matrix)
        {
            var subIndexes = indexes.slice();
            subIndexes.push("");
            this[i].forEach(callback, subIndexes);
        }
    }
};

Matrix.prototype.val = function(newVal)
{
    if (newVal) 
    {
        this.value = newVal;
        return this;
    }
    else
    {
        return this.value;
    }
};

然后你会这样创建你的矩阵

var numberofcolumns = 10;
var numberofrows = 10;

var matrix = new Matrix();

for (var i = -3; i < numberofcolumns; i++) {
    matrix[i] = new Matrix();
        for (var j = -4; j < numberofrows; j++) {
            matrix[i][j] = new Matrix();
            matrix[i][j].val("test " + i + " " + j);
        }
}

你可以在上面运行一些很酷的功能

console.log("Upper bound: " + matrix.LBound());
console.log("Lower bound: " + matrix.UBound());
console.log("Length: " + matrix.length());

matrix.forEach(function(item, index) 
    {
        if (item.val()) 
            console.log("Item " + index + " has the value \"" + item.val() + "\""); 
        else
            console.log("Item " + index + " contains " + item.length() + " items"); 
    });

演示:http: //jsfiddle.net/uTVUP/

于 2012-10-14T23:52:42.240 回答