Помогите исправить обработку матрицы
Цель в том, чтобы найти в матрице нули и заполнить нулями принадлежащие к элементу строку и столбец.
Написал функцию, которая по идее должна работать, но как я понял, на этапе перезаписи происходят что то непонятное для меня и все элементы обнуляются, подскажите как это исправить.
const myMatrix = [
[0, 2, 3, 4, 5],
[1, 2, 3, 4, 5],
[1, 2, 0, 4, 5],
[1, 2, 3, 4, 5],
[0, 2, 3, 4, 5]
];
function func (matrix) {
const matrixTemp = matrix.slice()
matrix.forEach ((row, rowIndex) => {
row.forEach((rowElem, elemId) => {
if(rowElem === 0) {
matrix[rowIndex].forEach((item,index) => {
if(matrixTemp[rowIndex][index] === 0) {
return
}
matrixTemp[rowIndex][index] = 0
})
matrix.forEach((item, index) => {
if(matrixTemp[index][elemId] === 0) {
return
}
matrixTemp[index][elemId] = 0
})
}
})
})
return matrixTemp
}
console.log("result:", func(myMatrix))
Ожидаемый результат:
const resultMatrix = [
[0, 0, 0, 0, 0],
[0, 2, 0, 4, 5],
[0, 0, 0, 0, 0],
[0, 2, 0, 4, 5],
[0, 0, 0, 0, 0]
];
Ответы (2 шт):
const cols = [],
rows = [];
//Получаем колонки и ряды которые заполним нулями
myMatrix.forEach((row, rowId) => {
row.forEach((n, colId) => {
if(n === 0){
cols.push(colId);
rows.push(rowId);
}
})
});
//Заполняем нулями
const result = myMatrix.reduce((res, row, rowId) => {
if(rows.includes(rowId)){
return [...res, Array.from({length: row.length}).fill(0)];
}
return [...res, row.map((col, colId) => cols.includes(colId) ? 0 : col)];
}, []);
Здраствуйте , проблема вашего кода это вот эта строчка:
const matrixTemp = matrix.slice()
Массивы имеют ссылочный тип данных , и для того чтобы один не ссылался на другой вы решили ,что пустого slice будет достаточно. Но нет, это прекрасно работает с одномерными массивами ,а вот с многомерными уже не работает.
Можете заменить вашу проблемную строчку на вот эту:
const matrixTemp = JSON.parse(JSON.stringify(matrix));
Это строчка конвертирует матрицу в строчный вид , и обратно достаёт из строчного.