Попытка вернуть столбцы в матрице, но метод не определен с правильным выводом консоли - PullRequest
0 голосов
/ 17 декабря 2018

Итак, я потратил некоторое время на выполнение этой головоломки, и, наконец, у меня правильный вывод на консоль.Я новичок в использовании методов 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])
        })
    });
}

Конкретный тестовый пример Iя пытаюсь передать здесь:

  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 голосов
/ 17 декабря 2018

Возможно, вы захотите использовать 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...