2015-06-29 3 views
0

Следующий код работает нормально, но меня попросили найти ошибку в следующем коде. Может кто-нибудь указать.Заполните многомерную матрицу матриц javascript со значением по умолчанию

function defaultMatrix(size) { 
    var defaultValue = 0; 
    var row = []; 
    var matrix = []; 
    for (var i=0; i < size; i++) { row.push(defaultValue); } 
    for (var i=0; i < size; i++) { matrix.push(row); } 
    return matrix; 
} 

console.log(defaultMatrix(6)); 
+1

'row' повторно используемый. IOW, каждая строка будет ссылкой на тот же самый массив, поэтому изменение одной строки повлияет на все строки. – bgoldst

+0

Можете ли вы дать больше информации о том, как функция должна действовать? –

+1

Он должен заполнить матрицу нулями по умолчанию. Это все, что у меня есть. Поэтому я думаю, что ответ, предоставленный @bgoldst, имеет смысл. Я проверил, изменив одно значение, и он вызывает изменение во всех строках. – rmsorPth

ответ

-1

Вы добавляете размер-раз в тот же ряд, который заканчивается размером * size large.

function defaultMatrix(size) { 
    var defaultValue = 0; 
    var rows = []; 
    var matrix = []; 
    for (var i=0; i < size; i++) { 

     // create row 
     rows[i] = []; 

     // create cells 
     for (var j=0; j < size; j++) { 
      rows[i].push(defaultValue); 
     } 

     // add row to matrix 
     matrix.push(rows[i]); 
    } 
    return matrix; 
} 

console.log(defaultMatrix(6)); 

Если вы хотите, чтобы инициализировать матрицу с 0 каждый раз, то вы можете еще больше упростить сценарий, как это:

function defaultMatrix(size) { 
    var matrix = []; 
    for (var i=0; i < size; i++) { 
     matrix.push(new Array(size)); 
    } 
    return matrix; 
} 

console.log(defaultMatrix(6)); 
0

Я думаю, что ошибка это в JS массивы ссылаются объекты. Итак, в вашем случае вы создаете матрицу только один раз. И вы вставляете его в строки.

Таким образом, в этом случае, если вы делаете такой код:

let arr = defaultMatrix(2); 
arr[0][0] = 1; 

И вы показываете обр [1] [0] и обр [2] [0] значение "1", так как массив на всех arr [n] одинаковы.

Для решения этой проблемы необходимо создать новый массив в каждой строке. Для решения кода вы только нужно изменить 1 строку:

for (var i=0; i < size; i++) { matrix.push(row.slice()); } 

slice создать копию текущего массива.

Но вы можете сделать все это в одной строке, например:

function defaultMatrix(size, defaultValue = 0) { 
    return Array(size).fill(0).map(() => {return Array(size).fill(defaultValue)}); 
} 
Смежные вопросы