0

Array Prototype を変更し、カスタム行列の転置を行うための行であるかのように列にアクセスしようとしています。特定の列にアクセスするためだけに、各列へのアクセスでまったく新しいオブジェクトを再割り当てして作成する必要がないことを確認したいと思います。

例えば...

var mcol = new column([[0,1,2],[3,4,5],[6,7,8]]);
alert(mcol[1]);

私が探しているのは、列を行であるかのように読み取ることです...(マトリックスで90度変換を行います)

mcol[1] = [1,4,7];

助言がありますか?

4

3 に答える 3

2

このコンストラクターを使用できます。

function column() {
    var arr = Array.prototype.slice.call(arguments);

    return arr;
}

やりたいことをやらせてくれます。

var mcol = new column([0,1,2], [3,4,5], [6,7,8]);
alert(mcol[1]); // alerts [3, 4, 5]
于 2012-08-01T22:47:47.060 に答える
1

メソッドを使用してMatrixコンストラクターを作成することをお勧めします。column

function Matrix() {
  this._rows = Array.prototype.slice.call(arguments);
}
Matrix.prototype.column = function (i) {
  // See (1)
  return this._rows.map(function (row) {
    return row[i];
  });
};

var m = new Matrix([0,1,2],[3,4,5],[6,7,8]);
console.log(m.column(1)); // [1,4,7]

(1) https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Array/map

于 2012-08-01T22:54:33.210 に答える
0

私が持っている解決策は回避策であり、配列を好きではない新しい配列にコピーする必要があります。Array プロトタイプをオーバーライドします。

    Array.prototype.rotate = function () {
      var rotated = [];
      var columns = 1; 
      for(var col = 0; col < columns; col++) {
        var myrow = [];
        for(var row = 0; row < this.length; row++){ // this.length is the longest column
          if(this[row].length > columns){
            columns = this[row].length;
          }
          if(this[row].length > col){
            myrow.push(this[row][col]);
          } else {
            myrow.push(null);
          }
        }
        rotated.push(myrow);
      }
      return rotated;
    }

var mcol = [[0,1,2], [3,4,5], [6,7,8]];
mcol = mcol.rotate();
alert(mcol[1]);

アラート [1,4,7]

誰かがアレイ全体を新しいアレイにコピーする必要のないソリューションを知っている人はいますか?

于 2012-08-08T19:07:09.867 に答える