尝试返回矩阵中的列,但未通过正确的控制台输出定义方法

时间:2018-12-17 19:31:54

标签: javascript matrix

所以,我花了一些时间做这个难题,最终我的控制台输出正确了。我不熟悉使用JavaScript方法,却很难找出this.columns为什么是undefined的原因。

这是我的代码:

export var Matrix = function(matrix) {
    var self = this
    let splitMatrix = matrix.split("\n") 
    self.rows = splitMatrix.map(function(row){return row.split(" ").map( Number )})
    self.columns = self.rows[0].forEach(function(index){
        self.rows.map(function(column){
            console.log(column[index])
        })
    });
}

我要通过的特定测试用例在这里:

  test('can extract column from non-square matrix', () => {
    expect(new Matrix('1 2 3\n4 5 6\n7 8 9\n8 7 6').columns[2]).toEqual([3, 6, 9, 6]);
  });

矩阵是由\n分隔的字符串。这将使您对为什么我以自己的方式拥有代码有一些了解。

这是我的控制台输出。

 console.log matrix.js:7
    1

  console.log matrix.js:7
    4

  console.log matrix.js:7
    7

  console.log matrix.js:7
    8

  console.log matrix.js:7
    2

  console.log matrix.js:7
    5

  console.log matrix.js:7
    8

  console.log matrix.js:7
    7

  console.log matrix.js:7
    3

  console.log matrix.js:7
    6

  console.log matrix.js:7
    9

  console.log matrix.js:7
    6

除了self.columns === undefined

以外,其他所有东西都很好。

这是一个明显的范围问题,但我完全不见了。

1 个答案:

答案 0 :(得分:0)

您可能想使用reduce()来构建列数组。由于列数可能与行数不同,因此map()在行上的操作实际上并不起作用。

对于每一行,您将迭代数字,并使用forEach中的索引将数字添加到适当的列中。

类似的东西:

var Matrix = function(matrix) {
    let splitMatrix = matrix.split("\n") 
    this.rows = splitMatrix.map(row =>  row.split(" ").map( Number ))
    this.columns = this.rows.reduce((arr, row) => {
        row.forEach((n, i) => {
            if (!arr[i]) arr[i] = []  // if there's no entry yet for column i, make it
            arr[i].push(n)            // push to the column
        })
        return arr
        
    }, []);
}

console.log(new Matrix('1 2 3\n4 5 6\n7 8 9\n8 7 6').columns)

如果您不想一次计算所有列,还可以使用一个简单的函数来获取特定列:

var Matrix = function(matrix) {
    let splitMatrix = matrix.split("\n") 
    this.rows = splitMatrix.map(row =>  row.split(" ").map( Number ))
}

Matrix.prototype.getColumn = function (colNum){
  // will return undefined if no value in column
  return this.rows.map(r => r[colNum])
}

let M = new Matrix('1 2 3\n4 5 6\n7 8 9\n8 7 6')
console.log(M.getColumn(1))