【问题标题】:Changing the Array Prototype in JavaScript在 JavaScript 中更改数组原型
【发布时间】:2012-08-01 22:40:08
【问题描述】:

我正在尝试更改数组原型并访问列,就好像它们是行一样,因此可以进行自定义矩阵转置。我想确保对每一列的访问不需要重新分配和创建一个全新的对象来访问特定的列。

例如...

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

我正在寻找的是像一行一样读取列...(对矩阵进行 90 度变换)

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

有什么建议吗?

【问题讨论】:

    标签: javascript arrays javascript-objects


    【解决方案1】:

    你可以使用这个构造函数:

    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]
    

    【讨论】:

    • 我想做的是在不复制整个数组的情况下进行矩阵变换。 ROW 0 -> COLUMN 0 和 ROW 1 -> COLUMN 1 等等...
    【解决方案2】:

    我建议你使用 column 方法创建一个 Matrix 构造函数:

    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/en/JavaScript/Reference/Global_Objects/Array/map

    【讨论】:

    • 为什么javascript需要保留prototype这个词。我们不应该能够使用 Array.slice.call(arguments);
    • 该行正在做的是使用所有数组在 arguments 对象上都具有的函数,该对象是一个看起来像数组但不是数组的特殊对象。 Array.slice 未定义,但 [].slice 已定义。所以你从数组中借用参数并调用()。
    • Array.prototype.slice.call(arguments) 几乎是 JavaScript 社区的标准做法。这是一种从参数对象中获取真实数组的方法。地图不会为此工作。 concat() 也可以。
    【解决方案3】:

    我的解决方案是一种变通方法,涉及将数组复制到我不喜欢的新数组中。它确实覆盖了 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]

    有谁知道不需要有人将整个数组复制到新数组的解决方案?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      • 2013-05-14
      • 1970-01-01
      相关资源
      最近更新 更多