所以,我花了一些时间做这个难题,最终我的控制台输出正确了。我不熟悉使用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
这是一个明显的范围问题,但我完全不见了。
答案 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))